在Java程序中多次删除MSSQL删除查询

时间:2013-05-21 15:41:34

标签: java sql jdbc

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

我的连接字符串中有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 个答案:

答案 0 :(得分:4)

我认为在这里使用批处理更合适。当您同时向数据库发送多个SQL语句时,可以减少通信开销,从而提高性能。

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

  • Statement,PreparedStatement和的 addBatch ()方法 CallableStatement用于向批处理添加单个语句。 executeBatch()用于启动所有的执行 声明组合在一起。
  • executeBatch ()返回一个整数数组,以及每个元素 数组表示相应更新的更新计数 言。
  • 就像您可以将批处理语句添加到批处理中一样,您也可以 使用 clearBatch ()方法删除它们。此方法删除所有 使用addBatch()方法添加的语句。但是,你做不到 有选择地选择要删除的语句。

示例代码

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

答案 1 :(得分: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();
 // ...

进一步参考:

希望这有帮助