【发布时间】:2015-02-17 04:57:53
【问题描述】:
所以我在 Java 应用程序中使用 jdbc 来查询几个不同的数据库。我让用户为每个用户输入他们的凭据。
其中一个数据库运行良好,但对于另一个,我有两个问题。
对于其中一个查询:
select 语句运行良好并从 SQL 开发人员(Oracle 的 SQL IDE)返回一整行 5 项,但是从 Java 应用程序执行时,只有第二列和第三列将数据放入我的变量中,其余的是空字符串。这是 SELECT 语句:
SELECT CD_DIST, CD_RQMT, TS_OPER_LAST_UPDTD, ID_OPER_LAST_UPDTD, ST_RQMT
FROM TWMMILESTONERQMT
WHERE CD_WR = '219033'
and CD_RQMT = '555';
这里是 Java 代码:
String wrNumber = ((Integer)(p.myWRNumber)).toString();
String selectStatement =
"SELECT CD_DIST, CD_RQMT, TS_OPER_LAST_UPDTD, ID_OPER_LAST_UPDTD, ST_RQMT " +
"FROM TWMMILESTONERQMT " +
"WHERE CD_WR = '" + wrNumber + "' " +
"and CD_RQMT = '555' ";
System.out.println(selectStatement);
PreparedStatement sel1 = stormsConn.prepareStatement(selectStatement);
ResultSet res = sel1.executeQuery();
while(res.next())
{
String district = res.getString("CD_DIST");
String requirement = res.getString("CD_RQMT");
String lastUpdatedTimestamp = res.getString("TS_OPER_LAST_UPDTD");
String lastUpdatedPerson = res.getString("ID_OPER_LAST_UPDTD");
String requirementState = res.getString("ST_RQMT");
if(district != null)
{
p.myRequirementDistrict = district;
}
if(requirement != null)
{
p.myRequirementNumber = requirement;
}
if(lastUpdatedTimestamp != null)
{
p.myRequirementLastUpdatedTimestamp = lastUpdatedTimestamp;
}
if(lastUpdatedPerson != null)
{
p.myRequirementLastUpdatedPerson = lastUpdatedPerson;
}
if(requirementState != null)
{
p.myRequirementState = requirementState;
}
}
res.close();
sel1.close();
对于另一个查询,它再次在 SQL Developer 中运行良好,但是当我在 Java 应用程序中运行它时抛出了这个异常:
java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist
对于这两个查询,我使用的凭据与我在 SQL 开发人员中使用的凭据相同,否则我会怀疑这是权限问题。几个小时以来,我一直在努力解决这个问题。
更新(已解决):
对于例外情况,我使用了错误的Connection 来运行我的查询,所以我在错误的数据库中查找表。难怪没找到。
至于空白结果列的奥秘,显然Oracle DB中varchar2类型的列不能使用jdbc驱动的.getString(...)函数。相反,必须使用.getAsciiStream(..) 函数,然后可以将InputStream 转换为String。 真的 糟透了,它没有警告您或无法以这种方式返回该数据类型的任何内容。我认为它应该抛出异常,或者在 jdbc 驱动程序中实现。
感谢大家的帮助!
【问题讨论】:
-
您确定列数据类型与字符串匹配吗?你总是打电话给
res.getString(),但这可能不适用于例如一个约会。此外,您可以尝试使用带有列索引的getXXX()变体作为参数而不是列名。 -
我尝试将其更改为使用
.getString(int columnIndex),但没有任何变化。由于您的评论,我调查了数据库中的数据类型,有趣的是,似乎其他数据类型的数据类型,例如Date或Number是 正在 工作的数据类型,varchar2类型的那些在我发布的查询中不起作用。我对为什么会发生这种情况感到非常困惑,因为查询似乎毫无例外地执行。 -
成功!您在数据类型方面走在了正确的轨道上,谢谢。原来
varchar2类型必须使用.getAsciiStream(...)函数而不是.getString(...)!那么你会得到一个InputStream,它可以被转换成一个字符串。