如何通过每次迭代重用SqlCommand参数?

我想为我的数据库实现一个简单的删除按钮。 事件方法看起来像这样:

private void btnDeleteUser_Click(object sender, EventArgs e) { if (MessageBox.Show("Are you sure?", "delete users",MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK) { command = new SqlCommand(); try { User.connection.Open(); command.Connection = User.connection; command.CommandText = "DELETE FROM tbl_Users WHERE userID = @id"; int flag; foreach (DataGridViewRow row in dgvUsers.SelectedRows) { int selectedIndex = row.Index; int rowUserID = int.Parse(dgvUsers[0,selectedIndex].Value.ToString()); command.Parameters.AddWithValue("@id", rowUserID); flag = command.ExecuteNonQuery(); if (flag == 1) { MessageBox.Show("Success!"); } dgvUsers.Rows.Remove(row); } } catch (SqlException ex) { MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information); } finally { if (ConnectionState.Open.Equals(User.connection.State)) User.connection.Close(); } } else { return; } } 

但我得到这个消息:

已声明变量@id。 变量名在查询批处理或存储过程中必须是唯一的。

有没有办法重用这个变量?

Parameters.AddWithValue向命令添加新参数。 由于您在具有相同名称的循环中执行此操作,因此您将获得exception“变量名称必须是唯一的”

因此,您只需要一个参数,在循环之前添加它,并在循环中仅更改它的值。

 command.CommandText = "DELETE FROM tbl_Users WHERE userID = @id"; command.Parameters.Add("@id", SqlDbType.Int); int flag; foreach (DataGridViewRow row in dgvUsers.SelectedRows) { int selectedIndex = row.Index; int rowUserID = int.Parse(dgvUsers[0,selectedIndex].Value.ToString()); command.Parameters["@id"].Value = rowUserID; // ... } 

另一种方法是使用command.Parameters.Clear(); 第一。 然后,您还可以在循环中添加参数,而无需两次创建相同的参数。

而不是:

 command.Parameters.AddWithValue("@id", rowUserID); 

使用类似的东西:

 System.Data.SqlClient.SqlParameter p = new System.Data.SqlClient.SqlParameter(); 

在foreach之外,只需在循环内手动设置:

 p.ParameterName = "@ID"; p.Value = rowUserID; 

错误是因为您在循环的每次迭代中反复添加相同的参数。

我会将该代码移动到一个单独的方法,以便我可以根据需要从多个位置调用它。

 public bool DeleteUser(int userId) { string connString = "your connectionstring"; try { using (var conn = new SqlConnection(connString)) { using (var cmd = new SqlCommand()) { cmd.Connection = conn; cmd.CommandType = CommandType.Text; cmd.CommandText = "DELETE FROM tbl_Users WHERE userID = @id"; cmd.Parameters.AddWithValue("@id", userId); conn.Open(); cmd.ExecuteNonQuery(); return true; } } } catch(Exception ex) { //Log the Error here for Debugging return false; } } 

然后这样称呼它

  foreach (DataGridViewRow row in dgvUsers.SelectedRows) { int selectedIndex = row.Index; if(dgvUsers[0,selectedIndex]!=null) { int rowUserID = int.Parse(dgvUsers[0,selectedIndex].Value.ToString()); var result=DeleteUser(rowUserID) } else { //Not able to get the ID. Show error message to user } }