sam*_*xli 20 java mysql jdbc resultset prepared-statement
当我执行以下代码时,我得到一个例外.我认为这是因为我正在准备新的声明与他相同的连接对象.我应该如何重写这个以便我可以创建一个准备好的语句并使用rs2?即使连接到同一个DB,我是否必须创建新的连接对象?
try
{
//Get some stuff
String name = "";
String sql = "SELECT `name` FROM `user` WHERE `id` = " + userId + " LIMIT 1;";
ResultSet rs = statement.executeQuery(sql);
if(rs.next())
{
name = rs.getString("name");
}
String sql2 = "SELECT `id` FROM `profiles` WHERE `id` =" + profId + ";";
ResultSet rs2 = statement.executeQuery(sql2);
String updateSql = "INSERT INTO `blah`............";
PreparedStatement pst = (PreparedStatement)connection.prepareStatement(updateSql);
while(rs2.next())
{
int id = rs2.getInt("id");
int stuff = getStuff(id);
pst.setInt(1, stuff);
pst.addBatch();
}
pst.executeBatch();
}
catch (Exception e)
{
e.printStackTrace();
}
private int getStuff(int id)
{
try
{
String sql = "SELECT ......;";
ResultSet rs = statement.executeQuery(sql);
if(rs.next())
{
return rs.getInt("something");
}
return -1;
}//code continues
Run Code Online (Sandbox Code Playgroud)
Ita*_*man 29
问题在于您获取数据的方式getStuff().每次您访问时getStuff()都获得新鲜ResultSet但不要关闭它.
这违反了Statement该类的期望(请参阅此处 - http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html):
默认情况下,每个Statement对象只能同时打开一个ResultSet对象.因此,如果读取一个ResultSet对象与另一个ResultSet对象的读取交错,则每个ResultSet对象必须由不同的Statement对象生成.如果存在打开的对象,则Statement接口中的所有执行方法都会隐式关闭该语句的当前ResultSet对象.
更糟糕的是rs来自调用代码.它也是在statement场外得出的,但它没有关闭.
底线:你有几个ResultSet属于Statement同时打开的同一个对象.
Vla*_*sny 11
当生成它的Statement对象关闭,重新执行或用于从多个结果序列中检索下一个结果时,ResultSet对象将自动关闭.
我猜while(rs2.next())你试图从rs1访问的东西后.但它已经关闭,因为你重新执行语句以从中获取rs2.由于你没有关闭它,我相信它在下面再次使用.
| 归档时间: |
|
| 查看次数: |
72912 次 |
| 最近记录: |