JSP连续执行两条SQL语句会有问题--只执行前面一条?

时间:2021-07-16 21:54:04
奇怪,在JSP中前后两句连续执行两条SQL语句,看结果发现只执行了第一条:
比如:下面的例子中,连续执行Delete 和Insert,结果原来的数据被删除了,却没有插入数据;而单独执行Delete和Insert(注释掉另外一句),都能够成功。
我用的是Tomcat4.1.24,SQLServer2000,windows2000.代码如下:

<%@ page contentType="text/html;charset=gb2312"%> 
<%@ page import="java.sql.*"%> 
<html> 
<body> 
<%//访问jlwz数据库中的Test表
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); 
String url="jdbc:microsoft:sqlserver://jlwz:1433;DatabaseName=test"; 
String user="sa"; 
String password=""; 
try{
Connection conn= DriverManager.getConnection(url,user,password); 
Statement stmt=conn.createStatement(); 
String sql="SELECT * FROM name"; 
stmt.executeQuery("Delete From Name");
stmt.executeQuery("Insert Into Name values('Your')");
ResultSet rs=stmt.executeQuery(sql); 
while(rs.next()) 
{
%> 
您的第一个字段内容为:<%=rs.getString(1)%> 
<%
}
out.print("数据库操作成功,恭喜你");
rs.close(); 
stmt.close(); 
conn.close(); 
}
catch(Exception e)
{
System.err.println(e);
}
%> 
</body> 
</html> 

18 个解决方案

#1


有空我帮你看看,记住,所有的奇怪的问题可能都和程序的错误有关

#2


你需要定义两个 statement
Statement stmt=conn.createStatement(); 
Statement stmt1=conn.createStatement(); 
然后一个用于删除和修改,一个用于查询,你试试吧,如果不行就创建两个连接
Connection conn= DriverManager.getConnection(url,user,password); 
Connection conn1= DriverManager.getConnection(url,user,password); 
Statement stmt=conn.createStatement(); 
Statement stmt1=conn1.createStatement()


#3


stmt.executeQuery("Delete From Name");,stmt.executeQuery("Insert Into Name values('Your')");
每次执行了以后要把Statement关掉。

#4


尽量不要用同一个stmt,..还有用submit

#5


同意 boat2002w(渔舟) 、yangtaylor(水无月烈火)

#6


通常情况下 insert delete之类的操作试要用executeUpdate的,如果如果要执行多条语句可以试试executeBatch(),
另外在 有关Statement的文当中有这样的说明
By default, only one ResultSet object per Statement object can be open at the same time. Therefore, if the reading of one ResultSet object is interleaved with the reading of another, each must have been generated by different Statement objects. All execution methods in the Statement interface implicitly close a statment's current ResultSet object if an open one exists. 

不知道对你这种不返回ResultSet 的语句到底有产生什么效果

#7


上面的意思大概是说一个Statement 对象只能打开一个ResultSet,Statement接口中所有执行sql的方法都会关闭当前Statement对象的ResultSet 对象当已经存在一个ResultSet对象。

你用的第一个executeQuery是要打开一个ResultSet对象的
而当你用第二个的时候他是不是关闭了当前的ResultSet对象(相当于没打开?)

#8


同意 boat2002w(渔舟),younggone(牛) 

建立两个Statement 
使用excuteUpdate 执行数据更新操作,使用executeQuery执行数据查询操作

#9


//这样改试试
....
stmt.executeUpdate("Delete From Name");
if (stmt!=null){
  stmt=null;
  stmt=conn.createStatement();
}
stmt.executeUpdate("Insert Into Name values('Your')");
....

#10


不需要定义两个,如果查询语句没有问题就不会出错的
你自己再仔细检查一下,必须保证SQL语句的正确性,可以把SQL语句单独拿出来测试一下
如果是正确的,请回复一下

#11


用executeUpdate()是没有什么问题的

#12


建两个连接,还要建两个ResultSet才可以用,因为你执行了第一个连接的时候,你的RS已经有了,所以肯定不会再执行第二个了,不信你试试就知道啦!

#13


改成
stmt.executeQuery("Delete From Name");
stmt.close();
stmt.executeQuery("Insert Into Name values('Your')");

#14


conn.setsetAutoCommit(false);


然后用
conn.commit();执行

#15


stmt.executeUpdate("Delete From Name");
stmt.executeUpdate("Insert Into Name values('Your')");

#16


最好对每一句作错误跟踪,第一条语句是否正确执行

#17


没有记录集返回。为什么要用ResultSet。每个SQL语句,应该都要调用stmt.execute()。除非你用stmt.executeBatch()。

#18


谢谢。我用executeUpdate方式。

#1


有空我帮你看看,记住,所有的奇怪的问题可能都和程序的错误有关

#2


你需要定义两个 statement
Statement stmt=conn.createStatement(); 
Statement stmt1=conn.createStatement(); 
然后一个用于删除和修改,一个用于查询,你试试吧,如果不行就创建两个连接
Connection conn= DriverManager.getConnection(url,user,password); 
Connection conn1= DriverManager.getConnection(url,user,password); 
Statement stmt=conn.createStatement(); 
Statement stmt1=conn1.createStatement()


#3


stmt.executeQuery("Delete From Name");,stmt.executeQuery("Insert Into Name values('Your')");
每次执行了以后要把Statement关掉。

#4


尽量不要用同一个stmt,..还有用submit

#5


同意 boat2002w(渔舟) 、yangtaylor(水无月烈火)

#6


通常情况下 insert delete之类的操作试要用executeUpdate的,如果如果要执行多条语句可以试试executeBatch(),
另外在 有关Statement的文当中有这样的说明
By default, only one ResultSet object per Statement object can be open at the same time. Therefore, if the reading of one ResultSet object is interleaved with the reading of another, each must have been generated by different Statement objects. All execution methods in the Statement interface implicitly close a statment's current ResultSet object if an open one exists. 

不知道对你这种不返回ResultSet 的语句到底有产生什么效果

#7


上面的意思大概是说一个Statement 对象只能打开一个ResultSet,Statement接口中所有执行sql的方法都会关闭当前Statement对象的ResultSet 对象当已经存在一个ResultSet对象。

你用的第一个executeQuery是要打开一个ResultSet对象的
而当你用第二个的时候他是不是关闭了当前的ResultSet对象(相当于没打开?)

#8


同意 boat2002w(渔舟),younggone(牛) 

建立两个Statement 
使用excuteUpdate 执行数据更新操作,使用executeQuery执行数据查询操作

#9


//这样改试试
....
stmt.executeUpdate("Delete From Name");
if (stmt!=null){
  stmt=null;
  stmt=conn.createStatement();
}
stmt.executeUpdate("Insert Into Name values('Your')");
....

#10


不需要定义两个,如果查询语句没有问题就不会出错的
你自己再仔细检查一下,必须保证SQL语句的正确性,可以把SQL语句单独拿出来测试一下
如果是正确的,请回复一下

#11


用executeUpdate()是没有什么问题的

#12


建两个连接,还要建两个ResultSet才可以用,因为你执行了第一个连接的时候,你的RS已经有了,所以肯定不会再执行第二个了,不信你试试就知道啦!

#13


改成
stmt.executeQuery("Delete From Name");
stmt.close();
stmt.executeQuery("Insert Into Name values('Your')");

#14


conn.setsetAutoCommit(false);


然后用
conn.commit();执行

#15


stmt.executeUpdate("Delete From Name");
stmt.executeUpdate("Insert Into Name values('Your')");

#16


最好对每一句作错误跟踪,第一条语句是否正确执行

#17


没有记录集返回。为什么要用ResultSet。每个SQL语句,应该都要调用stmt.execute()。除非你用stmt.executeBatch()。

#18


谢谢。我用executeUpdate方式。