2

在过去的几个小时里,我一直在搜索谷歌和堆栈溢出,似乎无法找到与此问题完全匹配的内容。我对java比较陌生,所以如果我只是在做一些非常愚蠢的事情,请纠正我!

问题:执行 try-with-resource 查询 (statement.executeQuery(stmt)) 时,我收到“语句未返回结果集”

我可以保证这是有效的 SQL,并且当通过 SSMS 运行时,查询有效 - 当使用 select...into...from 样式语法时,此查询也有效 [在 java 中]。select...into...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" < snip>

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>

后面会用到... < 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

我得到值为 1 的“loannum”的预期返回结果。

貌似跟executeQuery方法中的create table语句有关系,其实是临时表!有什么方法可以使上述内容与 create table (value type, value type, value type) insert into... 方法一起使用?

**注意:我尝试使用 .execute(String) 方法,并解析返回结果。它似乎有同样的问题,但完全有可能我执行不正确。

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

[编辑中]:在这种情况下,SQL 端的存储过程不是一个可行的选择。这是针对不允许将存储过程作为公司策略的数据仓库的查询(我已经推迟,并且已经被击倒) - 结果,我正在研究这个...... hackish 解决方案。

希望有人对这个问题有所了解!

4

1 回答 1

0

事实证明,在我更新为使用执行命令之后,我不小心将它包含在一个 try-with-resources 块中,导致将一个关闭的数据集返回给调用函数,然后将一个空的结果集传递给 create默认表模型。哎呀。

最终,执行查询与以下内容一起工作(仍然需要重构和清理,这只是“让它工作”):

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();
        }
于 2012-11-08T22:40:21.573 回答