0

リモート SQL データベースにクエリを実行する Java アプリケーションを構築しています。1 つの列を除くすべての列を読み取ることができます。そのコラムを読み込もうとすると、例外やエラーが発生することなく、アプリケーションが永久にハングします。誰でも理由がわかりますか?詳細は次のとおりです。

  • 私が使用しているドライバーはsun.jdbc.odbc.JdbcOdbcDriver、Java バージョン 6 アップデート 35 です。
  • その列 (#214) は他の列と何ら変わりはありません。確認するために、次の System.out を実行しました。
    • System.out.println("\t" + resultset.getMetaData().getColumnName(i) + "\t" + resultset.getMetaData().getColumnDisplaySize(i) + "\t" + resultset.getMetaData().getColumnType(i) + "\t" + resultset.getMetaData().getColumnTypeName(214) + "\t" + resultset.getMetaData().getColumnClassName(i));
    • 結果は次のとおりです。214 WorkLog 65535 -1 LONGVARCHAR java.lang.String
  • で値を読み取ろうとしましたresultset.getString(),resultset.getASCIIStream(),resultset.getCharacterStream()が、成功しませんでした。

最後に、コードは次のとおりです。

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");  
con = DriverManager.getConnection("jdbc:odbc:AR");  
Statement stmt = con.createStatement();  
ResultSet rs = stmt.executeQuery("SELECT * FROM HPD:HelpDesk WHERE \"CaseID+\" = '000000008815267'");  
while (rs.next()) {  
    for (int i = 1;i<rs.getMetaData().getColumnCount();i++){  
        System.out.println(i + "\t" + rs.getMetaData().getColumnName(i) + "\t" + rs.getString(i));  
    }  
}

EDIT : 列に読み込もうとすると、アプリケーションがハングします。この場合、rs.getString()

4

1 に答える 1

0

longvarchar は基本的に CLOB です。私が理解していることから、ストリームでこれを読む必要があります:

BufferedInputStream bufferedIn = new BufferedInputStream( rs.getBinaryStream( longvarcharColumnIndex ) );
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();

int index;
while ( ( int index = bufferedIn.read() ) != -1 )
{
    byteArrayOut.write( ( byte ) index );
}

bufferedIn.close();
byteArrayOut.close();

コードがぶら下がっている例は言いません。それはread()にありますか?available() にありますか? これらのメソッドを呼び出す方法には細心の注意を払う必要があります。そうしないと、読み取り可能なバイトがなくなると、コードが read() 状態でフリーズします。

于 2013-01-15T19:58:02.243 に答える