0

我正在构建一个 Java 应用程序来查询远程 SQL 数据库。我可以阅读除其中一列之外的所有内容。当我尝试阅读该专栏时,我的应用程序会永远挂起,而不会引发任何异常或错误。有人知道为什么吗?这是所有细节:

  • 我正在使用的驱动程序是sun.jdbc.odbc.JdbcOdbcDriverJava 版本 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));  
    }  
}

编辑:尝试读取列时应用程序挂起。在这种情况下, 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() 上吗?它在可用()上吗?您必须非常小心如何调用这些方法,否则当没有更多字节可供读取时,代码将冻结在 read() 状态。

于 2013-01-15T19:58:02.243 回答