如何通过每次迭代重用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 } }