当前位置: 首页 > 知识库问答 >
问题:

多个ResultSets,不同的查询,相同的数据库SQLSERVER

徐友樵
2023-03-14

使用JDBC驱动程序,我如何使用来自不同查询的多个结果集,而不不断地打开和关闭连接,因为我正在提取所需的w.e并将其传递给另一个方法。每次打开新的conn、语句和结果集时

public static void OppQuery() {
    Connection conn = null;
    Statement stmt = null;
    ResultSet result_set = null;
    try {
        Class.forName(JDBC_DRIVER);
        conn = DriverManager.getConnection(DB_URL);
        stmt = conn.createStatement();

        String emailInfoQuery = "FROM WHERE";
}


public static void addQuery(String latestRenewalId) {
    Connection conn = null;
    Statement stmt = null;
    ResultSet result_set = null;
    try {
        Class.forName(JDBC_DRIVER);
        conn = DriverManager.getConnection(DB_URL);
        stmt = conn.createStatement();
        String new_AddressLine1, new_AddressLine2;
        new_AddressLine1=new_AddressLine2="";
        int new_ChannelOption= 0;
}

我试图在一个方法中使用多个结果集,但它一直抛出异常,称结果集已关闭。我没有太多的SqlServver经验,所以任何指导都会有所帮助:-)

共有2个答案

关冠宇
2023-03-14

根据Mark的回答,由于Microsoft SQL Server JDBC驱动程序在默认情况下似乎会创建“可保留”的ResultSet对象,因此启用自动提交时,以下测试代码确实有效:

import java.sql.*;

public class SqlServerTest {

    public static void main(String[] args) {
        try {
            String connectionUrl =
                    "jdbc:sqlserver://localhost:52865;" +
                    "databaseName=myDb;" +
                    "integratedSecurity=true";
            Connection con = DriverManager.getConnection(connectionUrl);
            System.out.println(String.format("con.getAutoCommit returned %s", con.getAutoCommit()));

            Statement st1 = con.createStatement();
            ResultSet rs1 = st1.executeQuery("SELECT id FROM odds");
            rs1.next();
            System.out.println(String.format("value from rs1: %d", rs1.getInt(1)));

            Statement st2 = con.createStatement();
            ResultSet rs2 = st2.executeQuery("SELECT id FROM evens");
            rs2.next();
            System.out.println(String.format("value from rs2: %d", rs2.getInt(1)));

            rs1.next();
            System.out.println(String.format("value from rs1: %d", rs1.getInt(1)));

            rs2.next();
            System.out.println(String.format("value from rs2: %d", rs2.getInt(1)));

            rs2.close();
            rs1.close();
            con.close();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

}

对于名为[赔率]的表中的测试数据。。。

id  description
--  -----------
 1  one
 3  three
 5  five

...和[偶数]...

id  description
--  -----------
 2  two
 4  four
 6  six

...控制台输出为:

con.getAutoCommit returned true
value from rs1: 1
value from rs2: 2
value from rs1: 3
value from rs2: 4
孙阳舒
2023-03-14

在JDBC中,当连接处于自动提交模式(默认情况下)时,语句的任何执行都将提交前一个事务,并关闭同一连接上的任何打开的结果集(假设可保持性为ResultSet)。CLOSE_CURSORS_AT_COMMIT,这实际上不是SQLServer)的默认值。当需要打开多个结果集时,需要禁用自动提交(或使用ResultSet)。HOLD_CURSORS_OVER_COMMIT),需要使用多个语句对象。JDBC要求在相同的语句对象上执行新操作,关闭来自该语句的任何其他打开的结果集。

所以

  1. 禁用自动提交(Connection.setAutoCommit(false)
 类似资料:
  • 问题内容: 我正在尝试调整SQL查询以检查服务器上每个数据库中存在的特定字段中存在的值。 有100个单独的数据库,我想检查每个数据库的特定记录。 答案可能是使用下面的命令,但是我很难适应它。 我在下面的链接上获得了更大的成功; https://stackoverflow.com/a/18462734/3461845 我需要能够执行以下查询: 并且还为返回的每一行拉回数据库的名称; 任何帮助是极大的

  • 我们在Google表单响应电子表格中有员工训练数据,范围从A1到JQ1000。当Goggle表单完成时,这个电子表格会自动填充,但是很难查看,所以我想整理一下。 表单响应电子表格填充了培训活动、活动日期和参加该活动的员工。为了整理它,我认为最好使用转置(Transpose)(查询),但员工的姓名可能会在不同的列和行中出现多次。我不想写等等到JQ列。有人能帮我一个更简单的公式吗?

  • 问题内容: 我们在项目中使用MYSQL和Hibernate。 JPA用于将对象持久存储在DB中。 我们有多个具有相似代码的类 现在我们也想对oracle提供支持。我们应该怎么做?oracle不支持strategy = GenerationType.AUTO。 一个解决方案是我们可以在每个POJO中定义我们不想做的序列吗? 请提供一些建议,以便我们继续前进。 问题答案: AUTO策略也应适用于Ora

  • 问题内容: 我有一台服务器(SQL Server 2005),具有多个存档数据库(每季度1个,可追溯到8年),这些数据库在结构上都相同。 我经常需要在跨越n个数据库的特定日期范围内进行查询,通常n小于1-3,但是有可能我需要查询整个数据库。 从代码清洁度和性能角度来看,有什么想法是最有效的方法吗? 当前的解决方案是临时的,有一个视图集合跨越所有或仅是最新的数据库,其他解决方案是生成动态SQL,该S

  • 问题内容: SQL2008。 我有一个测试表: 我用10k测试行填充它。 我运行以下两个查询: 我不知道为什么这两个查询有不同的执行计划。 查询1确实针对UQ_Sale_RowVersion索引进行索引搜索。 查询2对PK_Sale进行索引扫描。 我想查询2做索引查找。 我将不胜感激。 谢谢你。 [编辑] 尝试使用datetime2而不是rowversion。同样的问题。 我也尝试强制使用索引(查

  • 问题内容: 您将如何在不同的环境中处理跨数据库查询。例如,db1-development和db2-development,db1-production和db2-production。 如果要在从db2到db1的开发中进行跨数据库查询,则可以使用完全限定的名称,即[db1-development]。[schema]。[table]。但是,如何在不同环境之间维护查询和存储过程?[db1-develop