首页 新闻 会员 周边 捐助

其他信息: 违反并发性: 成批命令影响了预期 4 条记录中的 3 条。

0
[已解决问题] 解决于 2014-09-18 10:19
    public static void Update(DataTable table, string srcTable)
        {

            DataSet ds = new DataSet();
            table.TableName = srcTable;
            ds.Tables.Add(table);
            string _tableName = srcTable;
            int result = 0;
            using (SqlConnection sqlconn = new SqlConnection(connectionString))
            {
                sqlconn.Open();

                //使用加强读写锁事务   
                SqlTransaction tran = sqlconn.BeginTransaction(IsolationLevel.ReadCommitted);
                try
                {

                    ds.Tables[0].AcceptChanges();
                    foreach (DataRow dr in ds.Tables[0].Rows)
                    {
                        //所有行设为修改状态   
                        dr.SetModified();
                    }
                    //为Adapter定位目标表   

                    SqlCommand cmd = new SqlCommand(string.Format("select * from {0} where {1}", _tableName, " 1=2"), sqlconn, tran);
                    SqlDataAdapter da = new SqlDataAdapter(cmd);
                    SqlCommandBuilder sqlCmdBuilder = new SqlCommandBuilder(da);
                    sqlCmdBuilder.ConflictOption = ConflictOption.OverwriteChanges;
                    da.AcceptChangesDuringUpdate = false;
                    string columnsUpdateSql = "";
                    SqlParameter[] paras = new SqlParameter[table.Columns.Count];
                    int parasIndex = 0;
                    //da.Fill(ds,srcTable);
                    //需要更新的列设置参数是,参数名为"@+列名"
                    for (int i = 0; i < table.Columns.Count; i++)
                    {
                        //此处拼接要更新的列名及其参数值
                        columnsUpdateSql += ("[" + table.Columns[i].ColumnName + "]" + "=@" + table.Columns[i].ColumnName + ",");
                        if (table.Columns[i].ColumnName == "id")
                        {
                            paras[i] = new SqlParameter("@" + table.Columns[i].ColumnName, SqlDbType.Int, 11, table.Columns[i].ColumnName);
                        }
                        else
                        {
                            paras[i] = new SqlParameter("@" + table.Columns[i].ColumnName, SqlDbType.NVarChar, 2000, table.Columns[i].ColumnName);
                        }


                    }
                    if (!string.IsNullOrEmpty(columnsUpdateSql))
                    {
                        //此处去掉拼接处最后一个","
                        columnsUpdateSql = columnsUpdateSql.Remove(columnsUpdateSql.Length - 1);
                    }
                    //此处生成where条件语句
                    string limitSql = ("[" + table.Columns[0].ColumnName + "]" + "=@" + table.Columns[0].ColumnName);
                    SqlCommand updateCmd = new SqlCommand(string.Format(" UPDATE [{0}] SET {1} WHERE {2} ", _tableName, columnsUpdateSql, limitSql));
                    //不修改源DataTable   
                    updateCmd.UpdatedRowSource = UpdateRowSource.None;
                    da.UpdateCommand = updateCmd;
                    da.UpdateCommand.Parameters.AddRange(paras);
                    //da.UpdateCommand.Parameters.Add("@" + table.Columns[0].ColumnName, table.Columns[0].ColumnName);
                    //每次往返处理的行数
                    da.UpdateBatchSize = table.Rows.Count;
                    result = da.Update(ds, _tableName);
                    ds.AcceptChanges();
                    tran.Commit();

                }
                catch (Exception ex)
                {
                    tran.Rollback();
                    throw ex;
                }
                finally
                {
                    sqlconn.Dispose();
                    sqlconn.Close();
                }


            }



        }

如果传入的id库里边没有就会报这错误,帮忙解决一下

问题补充:

正常情况下是可以正常修改,可是如果有重复的id或者把库里边跟dataset对应的id删掉就会出问题

亲爱de小孩的主页 亲爱de小孩 | 初学一级 | 园豆:72
提问于:2014-09-18 09:51
< >
分享
最佳答案
0

楼主还没有毕业还是刚刚毕业,明显就是被教科书毒害的一代人。

数据库事务操作就是要么都成功,要么都失败。

对于大部分的人来说,其实事务是没有必要的。(大神别喷,这是事实)

因为很多人根本不关心数据库原来是怎么样的,只要让他的SQL顺利执行就行了。

你如果要写事务,请先学习一下,事务是起什么作用的,否则,放弃事务吧。

奖励园豆:5
爱编程的大叔 | 高人七级 |园豆:30844 | 2014-09-18 10:08

那怎么改下才能不报错啊

亲爱de小孩 | 园豆:72 (初学一级) | 2014-09-18 10:13

好吧,我去掉事物就可以修改了

亲爱de小孩 | 园豆:72 (初学一级) | 2014-09-18 10:19

@亲爱de小孩: 有关事务的代码,删除掉就差不多了。

//使用加强读写锁事务 SqlTransaction tran = sqlconn.BeginTransaction(IsolationLevel.ReadCommitted);

tran.Commit();

tran.Rollback();

问题是你这些代码看不懂的话,你不如另外去找一段简单一点的代码。

爱编程的大叔 | 园豆:30844 (高人七级) | 2014-09-18 10:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册