我正在编写一个我正在改变角色的程序。 更改角色过程涉及从两个表中删除(以清除当前角色/组),插入两个表(以设置角色/组)。
我的连接字符串中有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();
}
}
}
});
答案 0 :(得分:4)
我认为在这里使用批处理更合适。当您同时向数据库发送多个SQL语句时,可以减少通信开销,从而提高性能。
不需要JDBC驱动程序来支持此功能。您应该使用DatabaseMetaData.supportsBatchUpdates()方法来确定目标数据库是否支持批量更新处理。如果JDBC驱动程序支持此功能,则该方法返回true。
示例代码
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();
// ...
进一步参考:
希望这有帮助