对不起,文字大小,但是我需要解释所有上下文。
我开发了一个中间件,该中间件从称为BMC Remedy AR System的特定工具读取数据。我正常阅读了他的数据库的许多列(日期,整数,字符串...),但是在一项新功能中,我从LONGVARCHAR列中获得了特定值。
当我尝试使用rs.getString获取字符串时(就像我在其他专栏中所做的那样),我的中间件保持处理状态,并且永远不会结束。我试图使用其他ResultSet资源,例如getNString,getBytes,getAsciiStream,但是最后我仍然遇到相同的问题(处理永远不会结束)。
这似乎很简单,但是我相信某些特定的变量会使其变得不可能。首先,我必须使用ODBC,因为该工具的数据库仅提供此类访问。其次,我必须在Windows 2003(32位)中使用Java6,因为其他工具已经在该服务器中完成了其他工作,而我无法更改他。最后一个也是最奇怪的问题是该工具的驱动程序非常老,ODBC仅在此特定版本的Java6上有效,我尝试使用其他JDK(脱机安装),但出现错误“不支持结果集类型”。我公司的一个人告诉我,很久以前,有人更改了Java6类JdbcOdbcConnection.java来生成另一个rt.jar程序包,但没有源代码来查看更改并回复新的Java版本(驱动程序是AR System ODBC驱动程序版本7.00.01.02)。
我安装了WAMP,并使用ODBC和PHP进行了快速测试,并且可以正常读取此列。
回到Java中有限的“工作区”,我尝试更深入地将InputStream逐字节转换为String,并发现了我认为是真正问题的其他问题。
private String getStringFromInputStream(InputStream is) throws Exception {
int total = 0;
int c = 0;
int i = 0;
try {
total = is.available();
} catch (Exception e) {
System.out.println("error");
}
final StringBuilder sb = new StringBuilder();
while(c != -1) {
c = is.read();
final byte b = (byte) c;
if(b > 0){
sb.append(String.format("%x", b));
System.out.println("SB " + sb.toString());
}
i++;
}
return sb.toString();
}
当我尝试获取总字节数时,我遇到了I / O异常...,因此我决定调试While,以发现InputStream的大小以了解发生的情况。
通过在每次迭代后打印StringBuffer,我得到了hexa并转换为文本(使用网站),并意识到这与PHP的结果相同,但是在InputStream的最后一个有效字节没有结束之后,它无限地继续为零在这一刻,我的申请仍在处理中。
我尝试对InputStream使用许多实现,但最后所有示例都使用“可用”或“读取”方法,而且我也遇到了相同的错误和处理问题。
有人可以帮助我吗?
感谢耐心阅读,直到这里。