gpt4 book ai didi

java - 使用临时表的有效 SQL 不返回任何结果集

转载 作者:行者123 更新时间:2023-11-29 09:09:10 25 4
gpt4 key购买 nike

过去几个小时我一直在 google 和 stack overflow 上搜索,似乎找不到与此问题完全匹配的内容。我是 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”<截图>

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();
}

/剪辑>

后面会用到...<截图>

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;

/剪辑>

我所期望的是一个缓存的结果集,它将在 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语句有关,不过是个临时表!有什么方法可以使上面的方法与创建表(值类型、值类型、值类型)insert into... 方法一起使用?

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

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

[编辑于]:在这种情况下,SQL 端的存储过程不是可行的选择。这是针对不允许将存储过程作为公司政策的数据仓库的查询(我已经推迟,并被打倒了)——结果,我正在研究这个……骇人听闻的解决方案。

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

最佳答案

事实证明,在我更新为使用 execute 命令后,我不小心将它包含在一个 try-with-resources block 中,导致将一个封闭的数据集返回给调用函数,然后它会出错并返回一个空结果集传递以创建默认表模型。糟糕。

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

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();
}

关于java - 使用临时表的有效 SQL 不返回任何结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13278830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com