并发冲突:UpdateCommand会影响预期1条记录0 [英] Concurrency violation: the UpdateCommand affected 0 of the expected 1 records

查看:252
本文介绍了并发冲突:UpdateCommand会影响预期1条记录0的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是新的C#和尝试一个DataGridView到MSSQL数据库绑定在Visual Studio 2010
中的数据绑定都OK了,一切似乎工作。除了一些莫名其妙的错误:



我得到了这个问题后错误:
更新同一行的2倍,
删除新插入更新行时当其他行已被删除(文字修改的DeleteCommand)之后排,
我在谷歌workes发现我的解决方案



无。我希望有人能帮助我与此有关。这里是TE代码:

 私人无效fillDatagrid()
{
//填写ADO.NET数据网格
康恩=新的SqlConnection(TestApp.Properties.Settings.Default.TestdatabaseConnectionString);
CMD = conn.CreateCommand();
conn.Open();
cmd.CommandText =SelectFrom;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(@表,SqlDbType.NVarChar,50).value的=国家;
cmd.Parameters.Add(@过滤器,SqlDbType.NVarChar,300).value的=;

适应=新SqlDataAdapter的(CMD);
DT =新的DataTable();
adapt.Fill(DT);
dt.TableName =国家;

conn.Close();

BindingSource的SRC =新的BindingSource();
src.DataSource = DT;
dt.RowChanged + =新DataRowChangeEventHandler(dt_RowChanged);

dgDatabaseGrid.DataSource = SRC;
dgDatabaseGrid.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
//dgDatabaseGrid.RowValidating + =新DataGridViewCellCancelEventHandler(dgDatabaseGrid_RowValidating);

//禁用列:
dgDatabaseGrid.Columns [0] =。可见假的;
dgDatabaseGrid.Columns [date_insert]可见=假。
dgDatabaseGrid.Columns [user_insert]可见=假。
dgDatabaseGrid.Columns [date_change]可见=假。
dgDatabaseGrid.Columns [user_change]可见=假。
dgDatabaseGrid.Columns [删除]可见=假。

//自动尺寸最后一列
dgDatabaseGrid.Columns [备注] = AutoSizeMode DataGridViewAutoSizeColumnMode.Fill。


SqlCommandBuilder CB =新SqlCommandBuilder(适应);
}

无效dt_RowChanged(对象发件人,DataRowChangeEventArgs E)
{

{
adapt.Update(DT);
}
赶上(SQLEXCEPTION EX)
{
的Debug.WriteLine(ex.Message);
}
}

私人无效dgDatabaseGrid_UserDeletingRow(对象发件人,DataGridViewRowCancelEventArgs E)
{
如果(!e.Row.IsNewRow)
{


的DialogResult响应= MessageBox.Show(你确定吗?,删除行?,
MessageBoxButtons.YesNo,
MessageBoxIcon.Question,
MessageBoxDefaultButton.Button2);

如果(响应== DialogResult.Yes)
{

// IPV删除 - >删除= 1
conn.Open();
CMD = conn.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText =DeleteFrom;
cmd.Parameters.Add(@表,SqlDbType.NVarChar,50).value的=国家;
cmd.Parameters.Add(@ ID,SqlDbType.Int).value的= e.Row.Cells [0] .value的;
cmd.ExecuteNonQuery();
conn.Close();


//从DataGrid中删除:
dt.Rows [dgDatabaseGrid.SelectedCells [0] .RowIndex] .Delete();

}

//随时取消!
e.Cancel = TRUE;

}
}


解决方案

更新同一行后第2次




有一个时间戳列(或任何其他列已更改/填充数据库服务器上)?当内存行是从什么是在数据库中不同的可能发生



您的问题。因为你使用的设置SelectCmd有(可能是)一个SP是一个更新后不刷新。




删除新插入的行<后/ p>


类似,造成插入



后不取新的ID

更新行时当其他行已被删除(文字修改的DeleteCommand)




完全不清楚。结果
,而为什么你行'手动'删除,而不是把它留给adapt.Update()的?而且你确定没有被执行两种方法?


I am new to c# and try to bind a datagridview to a mssql database in visual studio 2010. The databindings are OK and everything seems to work. Except for a few strange errors:

I get the error in the subject after: updating the same row 2 times, deleting a new inserted row, after updating a row when an other row was deleted (word changes to DeleteCommand)

None of the solutions I found on Google workes for me. I hope someone can help me with this. Here is te code:

    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;

            }
        }

解决方案

after updating the same row 2 times

Is there a Timestamp column (or any other column that is changed/filled on the Db server) ?

Your problem could happen when the in-memory row is different from what's in the Db. And because you use a SP for the SelectCmd there (probably) is no refresh after an update.

after deleting a new inserted row

Similar, caused not fetching the new Id after an insert

after updating a row when an other row was deleted (word changes to DeleteCommand)

totally unclear.
But why do you Delete rows 'manually' instead of leaving it to the adapt.Update() ? And are you sure that not both methods are executed?

这篇关于并发冲突:UpdateCommand会影响预期1条记录0的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆