【问题标题】:How to receive all ResultSets from Statement from JDBC?如何从 JDBC 的 Statement 中接收所有 ResultSets?
【发布时间】:2019-07-18 18:00:12
【问题描述】:

我执行以下查询:

SELECT 1; CREATE TABLE ....; SELECT 2;

之后我尝试获取所有结果集。我为此使用以下代码:

while(!stmt.getMoreResults()) {
 stmt.getResultSet();
}

不幸的是,我得到了第一个结果集。请告诉我我做错了什么?

【问题讨论】:

  • 在这个线程中查看答案stackoverflow.com/questions/10797794/…可能重复
  • 当您一次提交多个语句时,甚至没有定义 JDBC。
  • 问题是你误解了getMoreResults的真/假含义。 False 不代表没有更多结果,表示下一个结果是更新计数,而不是结果集。
  • 在同一个 Statement 中运行多个 SQL 语句是个坏主意。你应该单独运行这些。

标签: java jdbc


【解决方案1】:

您是说 Java 无法顺利完成 .Net 所做的事情吗?就这么简单吗? 无论作为批处理运行的脚本中的选择之间存在什么样的虚拟语句,C# 代码中的 bool IDataReader.NextResult() 都会可靠地返回下一个结果,跳过我们现在尝试调试的 Netezza 的下一个虚拟语句。多年来,它对所有支持批处理调用的平台都做了同样的事情,以防我们不得不处理它们。

【讨论】:

    【解决方案2】:

    从技术上讲,您的第二条CREATE TABLE 语句甚至不会返回结果集(尽管 JDBC 可能会返回受 DML 影响的记录的计数)。所以,如果你想捕获每个语句的概念返回值,那么你应该单独运行它们。

    如果您的第二个语句实际上是 SELECT,那么也许我们可以找到一些方法将查询组合在一起。

    阅读this canonical answer 以了解如何处理您确实有多个选择的情况。但是,请注意,并非所有数据库都支持这一点(例如 Oracle 不支持它)。并read here 了解为什么单个 JDBC 调用中的多个查询甚至可能是一件坏事。

    【讨论】:

    • 感谢您的回答。但是您能否提供指向文档或文章的链接,以便我可以阅读有关此问题的更多信息
    • 谢谢。但是您只添加了 Stack Overflow 的答案。你有可以证实你的话的文件或其他东西吗?因为现在我不明白为什么我不能读取我的案例中的所有结果集
    • 嗯...您的第二条语句没有结果集,因为它是创建表的 DML 语句。我建议不要在一个字符串中向 JDBC 发送三个语句,只需分别运行它们即可。
    • 我不认为该问题应该被视为规范答案,因为建议的解决方案在技术上是错误的(它假设 false 意味着没有更多结果,如果它包含语句则不正确不产生结果集)。我的回答here 展示了如何处理符合JDBC定义的多个结果。
    • @MarkRotteveel 也许是一个无耻的点赞策略,但它似乎正在发挥作用:-)
    猜你喜欢
    • 1970-01-01
    • 2018-05-06
    • 2022-12-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多