使用临时表的有效SQL返回没有结果集



过去几个小时我一直在搜索Google和Stack溢出,并且似乎无法在此问题上找到完全匹配的匹配。我对Java相对较新,所以如果我只是做一些非常愚蠢的事情,请纠正我!

问题:执行try-with-resource query(statement.executequery(stmt))时,我将获得一个'语句返回结果集'

我可以保证这是有效的SQL,当通过SSMS运行时,查询工作起作用 - 当使用Select ...进入...从样式语法中使用时,此查询也有效[在Java]。Select ... IN ... IN ... From不是一个可行的选项,因为它会引起性能问题(由于资源利用率,23秒查询变成了5分钟以上的查询)

概念证明:SQL文件:C: test.sql

set nocount on
create table #test (loannum int)
insert into #test (loannum)
select 1
select * from #test
drop table #test

此查询用于制作缓存结果集,以便我可以在其他功能周围传递数据,而无需与数据库开放连接...

注意:下面的sqlinfo只是" c: test.sql" <剪辑>

try(BufferedReader in = new BufferedReader(new FileReader(SQLInfo)))
                {
                    String str;
                    StringBuffer sb = new StringBuffer();
                    while((str = in.readLine()) != null)
                    {
                        sb.append(str + System.getProperty("line.separator"));
                    }
                    _stmt = sb.toString();
                }

</snip>

以后在下面使用...<剪辑>

try (Connection connection = DriverManager.getConnection(CONNECTION);
                Statement statement = connection.createStatement();
                ResultSet resultset = statement.executeQuery(_stmt)
            ) 
        {
            crs.populate(resultset);
            return crs;
        }
        catch (SQLException e) 
        {
            e.printStackTrace();
        }
        return crs;

</snip>

我期望的是一个缓存的结果集,该集将在DefaultTableModel中使用以显示" loannum"字段,值为1-我真正获得的是以下错误:" com.microsoft.sqlserver.jdbc.sqlserverexception:该语句未返回结果集...

如果我将SQL修改为以下内容:

set nocount on
select 1 as loannum
into #test
select * from #test
drop table #test

我获得了" loannum"的预期返回结果,值为1。

它似乎与ExecuteQuery方法中的创建表语句有关,但这是一个临时表!有什么方法可以使上述与Create Table(值类型,值类型,值类型)一起插入...方法?

**注意:我尝试使用.execute(String)方法,并通过返回结果解析。它似乎存在相同的问题,但是我可能会错误地实施它。

**次要注意:DefaultTableModel可以正常工作,并将信息返回到屏幕上显示的JTable。这动态分配列名,并显示关联的值。我可以在需要时提供此代码的示例,但我认为它与问题无关,因为这只是简单地创建结果集,而不是在尝试将信息分配给表模型时。

[在此编辑]:在这种情况下,SQL侧的存储过程不是可行的选择。这是针对数据仓库的查询,该仓库不允许存储的Procs作为公司策略(我已经退缩了,已经被击倒了) - 结果,我正在研究此问题... hackish解决方案。

希望有人对此问题有所了解!

事实证明,在更新以使用execute命令后,我将其不小心包含在一个try-with-resources块中,从而将封闭的数据集返回到调用功能,然后将传递一个空结果集以创建默认表模型,这将错误。whops。

最终,执行查询与以下内容一起使用(重构和清理仍然是必要的,这只是"使它起作用"):

try 
        {
            boolean hasResults = statement.execute(_stmt);
            do { //I think... this could only possibly get one result. FIXME
            if (hasResults) 
            {
                try(ResultSet rs = statement.getResultSet())
                {
                    CachedRowSetImpl crs = new CachedRowSetImpl();
                    crs.populate(rs);
                    return crs;
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
            hasResults = statement.getMoreResults();
            } while (hasResults || statement.getUpdateCount() != -1);
            } 
        catch (Exception e) 
        {
            e.printStackTrace();
        } 
        finally 
        {
            statement.close();
        }

最新更新