如何在每次迭代中重用SqlCommand参数?

mil*_*ler 17 c# sql-server ado.net

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

但我得到这个消息:

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

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

Tim*_*ter 47

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

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

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;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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