我尝试用
我正在构建一个Java应用程序来查询远程SQL数据库。除了一个专栏外,我能读懂所有的专栏。当我尝试读取该列时,我的应用程序只是永远挂起,没有触发任何异常或错误。有人知道为什么吗?以下是所有细节:
- 我使用的驱动程序是
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));
}
}
编辑:当试图读取列时,应用程序挂起。在本例中,rs.getString()
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()状态。