internal static void UpdateData(SqlConnection conn, string updateString,DataSet ds)
{ SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand(updateString,conn);
SqlCommandBuilder cb = new SqlCommandBuilder(da); da.DeleteCommand = cb.GetDeleteCommand();
da.InsertCommand = cb.GetInsertCommand();
da.UpdateCommand = cb.GetUpdateCommand();
//ds.AcceptChanges(); conn.Open();
try
{
//先添加数据
da.Update(ds.Tables[0].Select("","",DataViewRowState.Added)); //在更新数据
da.Update(ds.Tables[0].Select("","",DataViewRowState.ModifiedCurrent)); //最后删除数据
da.Update(ds.Tables[0].Select("","",DataViewRowState.Deleted)); MessageBox.Show("保存成功!");
}
catch(Exception Err)
{
MessageBox.Show(Err.Message,"保存失败!"); } conn.Close(); 这样做怎么老是报“并发冲突:updatecommand影响了0个记录”错误呀?
请大侠们给予帮忙,十分感谢!!!
{ SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand(updateString,conn);
SqlCommandBuilder cb = new SqlCommandBuilder(da); da.DeleteCommand = cb.GetDeleteCommand();
da.InsertCommand = cb.GetInsertCommand();
da.UpdateCommand = cb.GetUpdateCommand();
//ds.AcceptChanges(); conn.Open();
try
{
//先添加数据
da.Update(ds.Tables[0].Select("","",DataViewRowState.Added)); //在更新数据
da.Update(ds.Tables[0].Select("","",DataViewRowState.ModifiedCurrent)); //最后删除数据
da.Update(ds.Tables[0].Select("","",DataViewRowState.Deleted)); MessageBox.Show("保存成功!");
}
catch(Exception Err)
{
MessageBox.Show(Err.Message,"保存失败!"); } conn.Close(); 这样做怎么老是报“并发冲突:updatecommand影响了0个记录”错误呀?
请大侠们给予帮忙,十分感谢!!!
--------------------------
da.Update( ds.GetChanges() , ds.Tables[0].TableName );不就OK 了
如果正常操作没问题的。可是对于多条记录(10条以上),先增加n条后,又从n条中删除几条,再增加几条,保存,执行上述语句,就抱"并发冲突:updatecommand影响了0个记录”错误
把你的三条语句合并就行了。
不行呀
还是报那个错误:如果正常操作没问题的。可是对于多条记录(10条以上),先增加n条后,又从n条中删除几条,再增加几条,保存,执行上述语句,就抱"并发冲突:updatecommand影响了0个记录”错误
update之后,必须accepchanges()
另外在update的时候最后修改下update的command。
通过id来update。
yuwen16(rr)另外在update的时候最后修改下update的command。
通过id来update。中的"id来update",应如何做,能给一些启发的例子吗,不胜感谢!
另:
仅仅ds.accepchanges()是不可以的,还会报同样的错误!
因为ds并没有acceptechanges()故在ds中标志为DataViewRowState.Added.
当你第二次再 update(ds.Tables[0].Select("","",DataViewRowState.Added)))的时候。又会把上一次已经add的数据在add一遍,这样就有重复。在ado里面会报错。
换言之就是最好add一遍以后就调用ds.acceptechanges()方法。利用id来做update也是有原因的。
id为主键。利用id来做更新操作。可以保证不会产生并发错误。该错误提示也是“并发冲突:updatecommand影响了0个记录”。当然这必然要重写updatecommand。和deletecommand。
你仔细查看updatecommand的commandtext属性。看看它生成的updatecommand的text就明白为什么会有并发冲突了。所以我觉得比较好的方式是通过执行存储过程来更新。这样让数据库去处理并发的情况。
//最后删除数据
da.Update(ds.Tables[0].Select("","",DataViewRowState.Deleted)); da.Update(ds.Tables[0].Select("","",DataViewRowState.Added)); //在更新数据
da.Update(ds.Tables[0].Select("","",DataViewRowState.ModifiedCurrent));
------------------------------------
执行的成不成功,完全是根据 @@rowcount:影响的行数
检查你的UpdateCommand 是不是有这条语句 set nocount on
有则把它改为set nocount off
http://blog.csdn.net/zhzuo/archive/2004/08/06/67037.aspx
我看过你写的那个,应用到系统中还是会报这种错误!
{
string errMsg = null;
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand(updateString,conn);
SqlCommandBuilder cb = new SqlCommandBuilder(da); try
{
conn.Open();
da.Update(da.Tables[0]);
}
catch(Exception e)
{
errMsg = e.Message;
}
finally
{
conn.Close();
}if(errMsg != null)
{
MessageBox.Show(errMsg,"保存失败!");
}
else
{
MessageBox.Show("保存成功!");
}
}