gpt4 book ai didi

java - ResultSet.getNext() 不适用于PreparedStatement

转载 作者:行者123 更新时间:2023-12-02 00:04:35 30 4
gpt4 key购买 nike

我试图弄清楚为什么 ResultSet.next() 在我编写的 Java 代码中永远不会成立,在执行 SQL 查询后,该查询将 Oracle 11g 表中的结果返回到该 ResultSet 中...看起来好像在 java.sql.Connection 中使用PreparedStatement 时,代码无法正确获取返回的 ResultSet 内容。感谢任何帮助,详细信息如下:

表:

  CREATE TABLE "SHANDB"."ABSCLOBS" 
( "ID" NUMBER,
"XMLVAL" "XMLTYPE",
"IDSTRING" VARCHAR2(20 BYTE)
)

数据:

INSERT INTO absclobs VALUES ( 1, 
xmltype('<?xml version="1.0"?>
<EMP>
<EMPNO>221</EMPNO>
<ENAME>John</ENAME>
</EMP>', '1'));

INSERT INTO absclobs VALUES (2,
xmltype('<?xml version="1.0"?>
<PO>
<PONO>331</PONO>
<PONAME>PO_1</PONAME>
</PO>', '2'));

我正在运行的 Java 代码是为了从上面获取值来测试代码:

  public static void main(String[] args) throws Exception {
try {
String url = "jdbc:oracle:thin:@//localhost:1521/xe";
String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
String user = "shandb";
String password = "test";
Class.forName(driver);
connection = DriverManager.getConnection(url,user, password);
String selectID1 = "SELECT a.xmlval.getClobval() AS poXML FROM absclobs a where idstring=? and id=? ";
PreparedStatement preparedStatement = connection.prepareStatement(selectID1);

preparedStatement.setString(1, "1");
preparedStatement.setInt(2, 1);

rowsUpdated = preparedStatement.executeQuery();
while(rowsUpdated.next()){
String clobxml = rowsUpdated.getString(1);
System.out.println(clobxml);
}
} catch (ClassNotFoundException cnfe) {
System.err.println(cnfe);
} catch (SQLException sqle) {
System.err.println(sqle);
}
finally{
System.out.println("Rows affected: " + rowsUpdated);
connection.close();
}

}

上面的这部分代码永远不会运行,我不明白:

  while(rowsUpdated.next()){
String clobxml = rowsUpdated.getString(1);
System.out.println(clobxml);
}

...但是最终的打印语句显示 ResultSet 不为空:

Rows affected: oracle.jdbc.driver.OracleResultSetImpl@15f157b

有谁知道为什么我无法显示实际检索到的 XML clob 内容,和/或为什么上面的 while block 永远不会为 true?

谢谢:)

最佳答案

您的诊断不正确 - 这是:

Rows affected: oracle.jdbc.driver.OracleResultSetImpl@15f157b

不显示结果集非空。它只是显示 rowsUpdated 的值是对 oracle.jdbc.driver.OracleResultSetImpl 实例的引用,它不会覆盖 toString() 。这很容易为空。

我怀疑问题出在你的WHERE上子句不匹配任何记录。为了诊断,我建议您将其更改为:

String selectID1 = "SELECT a.xmlval.getClobval() AS poXML FROM absclobs a";

(当然,并摆脱参数设置调用)。这样您应该能够看到表中的所有值。然后您可以努力找出为什么您的WHERE子句没有按预期工作。

(顺便说一句,不清楚为什么你没有在问题的代码中声明 connectionrowsUpdated。它们绝对应该是局部变量......)

关于java - ResultSet.getNext() 不适用于PreparedStatement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14128621/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com