在过去的几个小时里,我一直在搜索谷歌和堆栈溢出,似乎无法找到与此问题完全匹配的内容。我对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 解决方案。
希望有人对这个问题有所了解!