本文转载:http://www.cnblogs.com/litianfei/archive/2007/08/16/858866.html
UpdateCommand和DeleteCommand出现DBConcurrencyException异常。调试提示:违反并发性: DeleteCommand 影响了预期 1 条记录中的 0 条;或 违反并发性: UpdateCommand影响了预期 1 条记录中的 0 条。
这里的违反并发性:不是指多人编辑引起的并发。
问题原因:
在插入、更新或删除操作过程中当受影响的行数等于零时由 DataAdapter 引发的异常。
可能的解决方法:
1 检查是否设有主键。
2 DeleteCommand的问题:检查是否含有自动编号字段(Access的自动编号字段可能会引发此异常);
UpdateCommand的问题:检查更新的字段的原始值是否为空值(原始空值更新时可能会引发此异常)。
3、多人并行操作也可能引发这样的异常。
----------------------
如果你采用了BindingSource和TableAdapter的话,请参考下面的代码:
-----------------------------------------------------------------------------------
例程来源:人民邮电出版社出版的书《Visual Basic .NET 2005数据库编程技术与实例》
详情请见:http://www.ptpress.com.cn/books/Book_Information.asp?BID=16271
-----------------------------------------------------------------------------------
Me.Validate()
Me.职工基本信息BindingSource.EndEdit()
Me.职工基本信息TableAdapter.Update(Me.工资管理DataSet.职工基本信息.GetChanges)
Me.工资管理DataSet.职工基本信息.AcceptChanges()
但是这样做后,导致了,dataset和数据库不一致的问题。是.AcceptChanges()
语句导致。
----------------------
也反应这样处理:http://software.it168.com/manual/ado.net/4-2-g.htm
? |
|
状态 | 说明 |
---|---|
Continue | 继续执行更新操作。 |
ErrorsOccurred | 中止更新操作并引发异常。 |
SkipCurrentRow | 忽略当前行并继续执行更新操作。 |
SkipAllRemainingRows | 中止更新操作但不引发异常。 |
我们建议目前这样处理:
if(this.工资管理DataSet.职工基本信息.GetChanges!=null)
{Me.职工基本信息TableAdapter.Update(Me.工资管理DataSet.职工基本信息.GetChanges)}
private void Form1_Load(object sender, EventArgs e)
{
string conn = "Data Source=.;Initial Catalog=TestDB;Integrated Security = SSPI;";
using (SqlConnection connection = new SqlConnection(conn))
{
connection.Open();
string select = "SELECT * FROM Table_1";
SqlDataAdapter da = new SqlDataAdapter(select, connection);
da.RowUpdating += new SqlRowUpdatingEventHandler(da_RowUpdating);
DataSet ds = new DataSet();
da.Fill(ds);
DataTable dataTable = ds.Tables[0];
dataTable.Rows[0][1] = "9999";
// 删除第8行
//dataTable.Rows[1].Delete();
SqlCommand cmd = new SqlCommand();
SqlCommandBuilder objCommandBuilder = new SqlCommandBuilder(da);
cmd=objCommandBuilder.GetDeleteCommand();
da.Update(dataTable);
//if (dataTable.GetChanges() != null)
//{
// da.Update(dataTable.GetChanges());
//}
//dataTable.AcceptChanges();
this.dataGridView1.DataSource = dataTable;
}
}
void da_RowUpdating(object sender, SqlRowUpdatingEventArgs e)
{
e.Status = UpdateStatus.Continue;
}