并发冲突:UpdateCommand影响了预期的1条记录中的0条

Vee*_*Wee 6 c# data-binding datagridview

我是c#的新手,并尝试将datagridview绑定到visual studio 2010中的mssql数据库.数据绑定正常,一切似乎都有效.除了一些奇怪的错误:

我在以下主题中收到错误:更新同一行2次,删除新插入的行,删除另一行后更新行(对DeleteCommand的单词更改)

我在Google上找到的解决方案都不适合我.我希望有人可以帮助我.这是te代码:

    private void fillDatagrid()
        {
            //fill datagrid ADO.NET
            conn = new SqlConnection(TestApp.Properties.Settings.Default.TestdatabaseConnectionString);
            cmd = conn.CreateCommand();
            conn.Open();
            cmd.CommandText = "SelectFrom";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@table", SqlDbType.NVarChar, 50).Value = "Countries";
            cmd.Parameters.Add("@filters", SqlDbType.NVarChar, 300).Value = "";

            adapt = new SqlDataAdapter(cmd);
            dt = new DataTable();
            adapt.Fill(dt);
            dt.TableName = "Countries";

            conn.Close();

            BindingSource src = new BindingSource();
            src.DataSource = dt;
            dt.RowChanged += new DataRowChangeEventHandler(dt_RowChanged);

            dgDatabaseGrid.DataSource = src;
            dgDatabaseGrid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
            //dgDatabaseGrid.RowValidating += new DataGridViewCellCancelEventHandler(dgDatabaseGrid_RowValidating);

            //disable columns:
            dgDatabaseGrid.Columns[0].Visible = false;
            dgDatabaseGrid.Columns["date_insert"].Visible = false;
            dgDatabaseGrid.Columns["user_insert"].Visible = false;
            dgDatabaseGrid.Columns["date_change"].Visible = false;
            dgDatabaseGrid.Columns["user_change"].Visible = false;
            dgDatabaseGrid.Columns["deleted"].Visible = false;

            //auto size last column
            dgDatabaseGrid.Columns["remarks"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;


            SqlCommandBuilder cb = new SqlCommandBuilder(adapt);
        }

        void dt_RowChanged(object sender, DataRowChangeEventArgs e)
        {
            try
            {
                adapt.Update(dt);
            }
            catch (SqlException ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }

private void dgDatabaseGrid_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {
            if (!e.Row.IsNewRow)
            {


                DialogResult response = MessageBox.Show("Are you sure?", "Delete row?",
                                     MessageBoxButtons.YesNo,
                                     MessageBoxIcon.Question,
                                     MessageBoxDefaultButton.Button2);

                if (response == DialogResult.Yes)
                {

                    //ipv delete --> deleted=1
                    conn.Open();
                    cmd = conn.CreateCommand();
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = "DeleteFrom";
                    cmd.Parameters.Add("@table", SqlDbType.NVarChar, 50).Value = "Countries";
                    cmd.Parameters.Add("@id", SqlDbType.Int).Value = e.Row.Cells[0].Value;
                    cmd.ExecuteNonQuery();
                    conn.Close();


                    //delete from datagrid:
                    dt.Rows[dgDatabaseGrid.SelectedCells[0].RowIndex].Delete();

                }

                //always cancel!
                e.Cancel = true;

            }
        }
Run Code Online (Sandbox Code Playgroud)

小智 7

我知道现在已经很晚了,但也许会有所帮助.

对您的代码进行了以下更改:

try
{
    adapt.Update(dt);
Run Code Online (Sandbox Code Playgroud)

将这些行放在这里并使用您的变量

    Me.yourTableAdapter.Update(Me.yourDataSet.yourTable)
    Me.yourDataSet.youTable.AcceptChanges()
    Me.yourTableAdapter.Fill(Me.yourDataSet.yourTable)
Run Code Online (Sandbox Code Playgroud)

它对我来说就像一个魅力,希望它对你有用.

}
catch (SqlException ex)
{
    Debug.WriteLine(ex.Message);
}
Run Code Online (Sandbox Code Playgroud)


Hen*_*man 3

更新同一行两次后

是否有时间戳列(或数据库服务器上更改/填充的任何其他列)?

当内存中的行与数据库中的行不同时,可能会出现问题。而且因为您对 SelectCmd 使用 SP,所以更新后(可能)不会刷新。

删除新插入的行后

类似,导致插入后未获取新 ID

当删除另一行时更新一行后(单词更改为DeleteCommand)

完全不清楚。
但是为什么要“手动”删除行而不是将其留给 adjustment.Update() 呢?并且你确定这两个方法都没有被执行吗?