尝试从gridview更新时出现死锁错误

时间:2019-08-21 06:39:53

标签: c# datagridview updates deadlock

  

事务(进程ID 588)在带有   另一个过程,已被选为死锁受害者。重新运行   交易。

当我尝试从datagridview更新数据时出现该错误,我该如何解决或者我的更新代码有什么问题,谢谢,

private void Button2_Click(object sender, EventArgs e)
    {

        using (SqlConnection con = new SqlConnection("***"))
        {
            con.Open();


            for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
            {
                // INSERT command:
                using (SqlCommand com = new SqlCommand("UPDATE tabl2 SET TEL8=@TEL8 WHERE id=@id and CIVILIDD=@CIVILIDD ", con))
                {
                    com.Parameters.AddWithValue("@id", dataGridView1.Rows[i].Cells[0].Value);
                    com.Parameters.AddWithValue("@CIVILIDD", dataGridView1.Rows[i].Cells[1].Value);
                    com.Parameters.AddWithValue("@TEL8", dataGridView1.Rows[i].Cells[2].Value.ToString());

                    com.ExecuteNonQuery();
                }
            }
            MessageBox.Show("Successfully UPDATE....");
        }
    }

sql服务器表:

id = int
CIVILIDD = bigint
TEL8 = nvarchar (MAX)

1 个答案:

答案 0 :(得分:0)

如果可以,请尝试

using (SqlCommand com = new SqlCommand("UPDATE tabl2 SET TEL8=@TEL8 WHERE id=@id and CIVILIDD=@CIVILIDD ", con))
{
    com.Parameters.Add("@id", SqlDbType.Int);
    com.Parameters.Add("@CIVILIDD", SqlDbType.BigInt);
    com.Parameters.Add("@TEL8", SqlDbType.NVarChar);
    for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
    {
        com.Parameters["@id"].Value = dataGridView1.Rows[i].Cells[0].Value);
        com.Parameters["@CIVILIDD"].Value = dataGridView1.Rows[i].Cells[1].Value);
        com.Parameters["@TEL8"].Value =  dataGridView1.Rows[i].Cells[2].Value.ToString());
    }
    com.ExecuteNonQuery();
}

在运行single_user之前将数据库更改为update,然后将其还原回multi_user


new SqlCommand("Alter Database {databaseName} SET SINGLE_USER With ROLLBACK IMMEDIATE", con);
//your update commands
new SqlCommand("Alter Database {databaseName} SET MULTI_USER With ROLLBACK IMMEDIATE", con);

也会发生这种情况

  • 如果所有SQL连接和命令都使用using SqlCommandusing SqlConnection,请检查所有sql连接和命令创建。我认为这可能是由于连接和命令尚未处理而失败的原因。
  • 也许服务器非常繁忙,对commandtimeoutconnectiontimeoutcommandtimeout设置进​​行研究会导致您的查询一直等待,直到设置了该查询为止设为0。connectiontimeout将导致您的连接尝试等待,直到设置为0为止建立连接。