空结果集,使用 JDBC 和 MSSQL

Posted

技术标签:

【中文标题】空结果集,使用 JDBC 和 MSSQL【英文标题】:Empty Resultset, using JDBC with MSSQL 【发布时间】:2018-07-31 15:01:41 【问题描述】:

我有一个 Java 应用程序,它已经与 mysql 数据库一起工作。我还希望它与 Microsoft SQL Server 兼容,因此我在后台添加了与 SQL Server(Express 版本)数据库的替代连接机会。但查询只返回空结果集。

我在 SQL Server 中已经做过的事情;

我创建了一个新用户并将他映射到选定的数据库。

我还插入了一些虚拟数据。当我在 SQL Server Management Studio 中执行查询时,它会返回预期的结果,所以我认为查询应该是正确的。

我还在 SQL Server 中尝试了不同的配置,但在我的 Java 应用程序中仍然得到空结果集。

我为用户提供了所选数据库的角色成员身份 db_datawriter 和 db_datareader(我不知道这是否有必要)。

对于整个服务器,我给了use grant权限,可以连接任意数据库,连接sql,创建任意数据库,查看任意数据库。

对于我授予用户删除、执行、选择、插入、连接和更新权限的数据库。

已经在 J​​ava 中与 SQL Server 数据库一起使用的功能:

    我可以连接服务器和数据库 我也可以执行查询而不会出现任何错误,但结果集始终为空。

我真的不知道我该去哪里找我的错。我以为我没有正确配置 SQL Server,因为当我对我的 MySQL 数据库做同样的事情时,我得到了正确的结果集。但是在 SQL Server Management Studio 中使用同一用户执行查询,也会显示预期的数据。

这是一个代码 sn-p,它执行 SQL 查询并将行添加到 Jtable 中。

public void TableShow(DefaultTableModel table_lin) 

    PreparedStatement ps_lin = null;
    ResultSet rs_tbl = null;
     try
     
        
        String lin_sqltbl = "SELECT Linien.ID, Linien.lin_name, "
                + "Customer.cus_name FROM Customer INNER JOIN Linien "
                + "ON Customer.ID = Linien.cus_id";
        
         System.out.println(lin_sqltbl);
        
        
        ps_lin = this.conn.prepareStatement(lin_sqltbl);
        
        
        table_lin.setRowCount(0);
        table_lin.setColumnCount(0);
        
        
        rs_tbl = ps_lin.executeQuery();
        
        
        table_lin.addColumn("ID");
        table_lin.addColumn("Linie");
        table_lin.addColumn("Kunde");
        
        while(rs_tbl.next())
        
            int col1 = rs_tbl.getInt("Linien.ID");
            String col2 = rs_tbl.getString("Linien.lin_name");
            String col3 = rs_tbl.getString("Customer.cus_name");
           
           
            Object[] row = col1, col2, col3;
            System.out.println(i + ": " + row + "\n");
            table_lin.addRow(row);
        
        
            
    
    
    catch(SQLException ex) 
    ...

如果有人能给我有用的提示,我将非常感激。

【问题讨论】:

您在 SQL Server 管理工作室中创建了虚拟数据。你确定你提交了这些数据吗?我没有看到您的代码有任何其他明显的问题,尽管您的连接是一个实例字段这一事实可能会隐藏一些并发使用问题。考虑发布minimal reproducible example。 【参考方案1】:

试试this guide:

我遇到了同样的问题,在我的连接语句中添加以下 (ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE) 后,它现在正在返回数据:

cnx.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

【讨论】:

以上是关于空结果集,使用 JDBC 和 MSSQL的主要内容,如果未能解决你的问题,请参考以下文章

通过 JDBC 调用 Sybase 存储过程时的空结果集

对空结果集的非法操作 - 如何检查它是不是为空? [复制]

从 Laravel 4 中的 MSSQL 存储过程读取多个结果集

SQLServerException:为更新生成了一个结果集

将我的 mssql 查询变成结构化的 xml 结果集

Atitit  jdbc 处理返回多个结果集