并发冲突:UpdateCommand会影响预期1条记录0 [英] Concurrency violation: the UpdateCommand affected 0 of the expected 1 records
问题描述
我是新的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屋!