2013-05-21 35 views
-1

我正在编写一个程序,我正在改变角色。 更改角色过程涉及从两个表中删除(清除当前角色/组),插入两个表(设置角色/组)。在Java程序中多删除MSSQL删除查询

我在我的连接字符串中有allowMultipleQueries = true,但它看起来像只有第一个查询正在运行。

该数据库是一个MSSQL数据库。

有没有办法来运行这两个查询?我可以从两个表中删除吗?

我的代码如下:

JButton changeRoleBtn = new JButton("Change Role"); 
    changeRoleBtn.setBounds(50, 375, 150, 30); 
    changeRoleBtn.setToolTipText("Changes the role of the User"); 
    changeRoleBtn.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      if (requesterRole.isSelected()) 
      { 
       StringBuffer getRolesQuery3 = new StringBuffer("delete from hib.personrole where personid = '"); 
       getRolesQuery3.append(userID).append("'"); 
       StringBuffer getRolesQuery4 = new StringBuffer("delete from hib.persongroup where personid = '"); 
       getRolesQuery4.append(userID).append("'"); 
       try 
       { 
        ResultSet rs = stmt.executeQuery(getRolesQuery3.toString()); 
        ResultSet rs1 = stmt.executeQuery(getRolesQuery4.toString()); 

        boolean empty = true; 
        if(empty) 
        { 
         userRoleLbl.setText("The User is a Requester"); 
         System.out.println(rs); 
         System.out.println(rs1); 
        } 
       } 
       catch(Exception e2) 
       { 
        System.out.println(e2); 
       } 
      } 
     } 
    }); 

我已经改变了它有准备的发言中,我碰到下面的错误,虽然当我运行它。 java.sql.SQLException: Invalid parameter index 2.

changeRoleBtn.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      if (requesterRole.isSelected()) 
      { 
       try 
       { 
        PreparedStatement ps1, ps2; 
        ps1 = con.prepareStatement("delete from hib.personrole where personid = ?"); 
        ps2 = con.prepareStatement("delete from hib.persongroup where personid = ?"); 

        ps1.setInt(1, userID); 
        ps2.setInt(2, userID); 

        ps1.executeQuery(); 
        ps2.executeQuery(); 

        con.commit(); 

        userRoleLbl.setText("The user is a requester"); 

       } 
       catch(Exception e3) 
       { 
        e3.printStackTrace(); 
       } 

      } 
     } 
    }); 
+2

SQL注入提前!更好地使用准备好的语句:http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html – Barranka

+1

你的意思就像'从hib.personrole中删除personid在([pid1],[pid2])''中? – Lucas

+0

Javadocs是你的朋友。 '默认情况下,每个Statement对象只能同时打开一个ResultSet对象。因此,如果一个ResultSet对象的读取与另一个ResultSet对象的读取交错,则每个对象必须由不同的Statement对象生成。在Statement接口中的所有执行方法隐式关闭一个语句的当前ResultSet对象(如果存在一个打开的对象)。http://docs.oracle.com/javase/6/docs/api/java/sql/Statement.html –

回答

1

你必须独立执行各delete指令,但没有限制,做到这一点。

正如我在我的评论说,你的代码是容易受到SQL注入,所以我建议你使用准备好的语句:

// ... 
PreparedStatement ps1, ps2; 
ps1 = con.prepareStatement("delete from hib.personrole where personid = ?"); 
ps2 = con.prepareStatement("delete from hib.persongroup where personid = ?"); 

ps1.setString(1, userID); 
ps2.setString(1, userID); 

ps1.execute(); 
ps2.execute(); 
// ... 

更多参考:

希望这会有所帮助

+0

谢谢,它看起来像这样会工作。我遇到的问题是,查询似乎没有运行。 – DarthOpto

+0

@DarthOpto请确定你正在提交指令:'con.commit()' – Barranka

+0

@DOntOpto并检查是否有异常弹出某处(确保打印所有可能的异常的堆栈跟踪) – Barranka

1

我相信这将是更合适使用here.When你送几个SQL语句到数据库在一次批,可以减少通信开销的量,从而提高性能。

JDBC驱动程序不需要支持此功能。您应该使用DatabaseMetaData.supportsBatchUpdates()方法来确定目标数据库是否支持批量更新处理。如果您的JDBC驱动程序支持此功能,则该方法返回true。

  • 声明的PreparedStatement的addBatch()方法,和 CallableStatement的用于个别语句添加到该批料中。 executeBatch()用于开始执行分组在一起的所有 语句。
  • executeBatch()返回一个整数数组,每个元素 该数组表示更新 语句的更新计数。
  • 就像您可以将语句添加到批处理中一样,您可以使用clearBatch()方法删除它们。此方法将删除使用addBatch()方法添加的所有 语句。但是,您不能 有选择地选择要删除的语句。

    示例代码

` 

con.setAutoCommit(假); stmt.addBatch(getRolesQuery3);
stmt.addBatch(getRolesQuery4); ResultSet rs = stmt.executeBatch();

`