首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

DataTable批量更新中,执行到dr.SetModified()跳出有关问题

2013-06-25 
DataTable批量更新中,执行到dr.SetModified()跳出问题。我是想用ListBox调整好菜单顺序,后将index作为排序,

DataTable批量更新中,执行到dr.SetModified()跳出问题。
我是想用ListBox调整好菜单顺序,后将index作为排序,批量更新到数据库中。
本来想着用法应该没什么问题,调试发现dr.SetModified()一执行就跳出。
datatable数据段(数据来自ListBox):

DataTable dt = new DataTable("T_Nav_1");
            dt.Columns.Add(new DataColumn("Nav_1_id", typeof(Int32)));
            //dt.Columns.Add(new DataColumn("Nav_1_Name", typeof(System.String)));
            dt.Columns.Add(new DataColumn("NavOrder", typeof(Int32)));

            for (int i=0; i < ListBox1.Items.Count; i++)
            {
                dt.Rows.Add(new object[] { ListBox1.Items[i].Value, i });//ListBox1.Items[i].Text,
            }
            int n = Update(dt);


想用 标识行为已修改状态,直接更新DataTable, 感觉用 Fill填充后再修改里面的数据再更新太绕。
Update方法段:执行到dr.SetModified();直接跳至catch内。

public int Update(DataTable dt)
        {
            int res = 0;
            dt.PrimaryKey = new DataColumn[] { dt.Columns["Nav_1_id"] };
            using (SqlConnection sqlconn = new SqlConnection(DBUtility.PubConstant.ConnectionString))
            {
                sqlconn.Open();
                //事务 
                SqlTransaction tran = sqlconn.BeginTransaction(IsolationLevel.ReadCommitted);
                try
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        //所有行设为修改状态   
                        dr.SetModified();
                    }
                    //为Adapter定位目标表 
                    SqlCommand cmd = new SqlCommand("select * from [T_Nav_1] where 1=0", sqlconn, tran);
                    SqlDataAdapter da = new SqlDataAdapter(cmd);


                    SqlCommandBuilder sqlCmdBuilder = new SqlCommandBuilder(da);
                    da.AcceptChangesDuringUpdate = false;
                    SqlCommand updatecmd = new SqlCommand("UPDATE [T_Nav_1] SET [NavOrder] = @NavOrder where Nav_1_id=@Nav_1_id");
                    //不修改源DataTable   
                    updatecmd.UpdatedRowSource = UpdateRowSource.None;
                    da.UpdateCommand = updatecmd;
                    da.UpdateCommand.Parameters.Add("@NavOrder", SqlDbType.Int, 4, "NavOrder");
                    da.UpdateCommand.Parameters.Add("@Nav_1_id", SqlDbType.Int, 4, "Nav_1_id");
                    da.UpdateBatchSize = 1000;
                    res = da.Update(dt);
                    dt.AcceptChanges();
                    tran.Commit();
                    sqlconn.Close();
                }
                catch
                {
                    tran.Rollback();
                    return -1;
                }
            }
            return res;
        }


------解决方案--------------------


来晚了DataTable批量更新中,执行到dr.SetModified()跳出有关问题

热点排行