Java 使用 SQL 执行方法但能够访问结果
我没有在代码中到处使用复杂的 SQL 查询、尝试、捕获和终结,而是使用了一个方法 execute(SQL,最多三个输入)
但是,如果尝试访问 ResultsSet,这会在执行之外产生得到错误:
"Operation not allowed after ResultSet closed"
这是因为当您关闭PreparedStatement时,它会关闭ResultsSetToo(并且似乎没有办法解决它)。
有办法解决这个问题吗?我唯一能想到的就是将其转换为存储的数组
非常感谢您的时间,
Rather than having complex SQL queries, tries, catch and finals everywhere in the code I have a method execute(SQL, up to three inputs)
however if trying to access the ResultsSet this produces outside of the execute you get the error:
"Operation not allowed after ResultSet closed"
Which is because when you close the PreparedStatement it closes the ResultsSetToo (and there seems to be no way around it).
Is there a way to fix this? The only thing I could think of was converting it to an array which is stored
Many thanks for your time,
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我过去也遇到过同样的问题。现在我使用这个方法:
它不返回
ResultSet
,而是返回一个 Map 列表(每个 Map 代表 1 行)。第一个字符串是列标签,第二个字符串是列的值。我希望它有帮助。 :-)I have encountered the same problem in the past. Now i use this method:
Instead of returning a
ResultSet
, it returns a list of Maps(each one representing 1 row). The first String is the column Label, and the second is the column's value. I hope it helps. :-)正确。因此在处理完结果之前可能不会关闭PreparedStatement。
我会定义一个接口,例如ResultConsumer或execute()的调用者可以实现的类似接口。然后在您的execute()方法中,您只需将结果集传递给消费者即可。
然后你的execute()可能看起来像这样
(为了清楚起见,我删除了所有错误检查和异常处理,当然你需要处理它)
Correct. So may not close the PreparedStatement until you have processed the result.
I would define an interface e.g. ResultConsumer or something similar that the caller of execute() can implement. Then inside your execute() method you simply pass the Resultset to the consumer.
Then your execute() could look like this
(I removed all error checking and exception handling for clarity, of course you'll need to deal with that)
一段时间前,我也遇到过同样的问题。经过一番思考后,我们决定按照下面的方式进行设计。
由于某些特定原因,我在类中创建了一个字段,如下所示
在
ExecuteRequest
类中使用了以下代码。您可以使用此方法作为解决方案。
Some time back, I was in same problem to deal with. After some pondering over this design we decided to do it like below.
For some specific reason, I created a field in my class as given below
In
ExecuteRequest
class below code is used.You can use this approach as a solution.