Adapter.update

 Adapter.update更新数据思路整理及问题

​    1、adapter的构造。

​    ​    使用sql语句,得到目标表的数据以及结构,然后构建adapter,将adapter内的数据以及结构完全赋给一个临时的datatable 【adapter.Fill(tempTable)】,然后用tempTable于要插入的数据集合datatable做merge操作。

   2、 merge操作

​       merge操作如果没有对目标datatable设置主键,那么两个datatable merge的时候一定是源datatable的数据行DataRowState都

​    会变成Added。所以,对于源datatable于目标datatable(这里是tempTable)相同的数据,如果想做过滤,必须给tempTable 指​    定主键,然后merge操作根据主键过滤重复数据。

​    参考资料:​    http://msdn.microsoft.com/zh-cn/library/wkk7s5zk(v=VS.80).aspx

 ​   3、 OleDbCommondBuilder自动生成update、insert、delete语句

​    OleDbCommondBuilder自动根据adapter获取的结构,生成相应的update、insert、delete语句,而生成语句的依据是DataRowState,如果是added,则生成insert commond。

 ​    4、update(dataRow[] datarow)操作

​    对update内所有的DataRow根据生成的语句,执行增删改操作。

 

注意点:

​    1、首先需要对相应的表进行主键设置,这样才对tempTable设置主键的时候才不会报错。报错大致说是没法取到主键信息。

遗留问题:

​    1、 对于DataRowState为modify的记录,没法更新。只能说是把主键重复的不再插入。

​    2、 表为空的时候,会报错。

​   ​     报错内容: Failed to enable constraints. One or more rows contain values violating non-null, unique, or foreign-key ​    ​    constraints.

 

针对遗留问题以及我整理的思路问题,请教大家!有碰到类似问题的请多多指教!

 

 private void StoreData(SyncDataTable syncDataTable)
        {
            string sql = syncDataTable.SelectSql;
            OleDbCommand command = null;

            try
            {
                command = new OleDbCommand(sql, connection);
                OleDbDataAdapter adapter = new OleDbDataAdapter(command);
               
                DataTable tempTable = new DataTable();
                adapter.Fill(tempTable);
                //给tempTable创建主键
                if (!string.IsNullOrEmpty(syncDataTable.KeyColumn))
                {
                    string[] keyColumn = syncDataTable.KeyColumn.Split(Convert.ToChar(","));

                    DataColumn[] keys = new DataColumn[keyColumn.Length];
                    for (int i = 0; i < keyColumn.Length; i++)
                    {
                        keys[i] = tempTable.Columns["" + keyColumn[i] + ""];
                        Log.Debug("keycolums :" + keyColumn[i]);
                    }
                    tempTable.PrimaryKey = keys;
                }

                DataRow[] errorsRows = tempTable.GetErrors();
                foreach (DataRow errorRow in errorsRows)
                {
                    foreach (DataColumn dc in tempTable.Columns)
                    {
                        Log.Debug("My column error info:" + errorRow.GetColumnError(dc));
                    }
                }
                tempTable.Merge(syncDataTable.DbDataTable, true);

                DataRow[] addedRows = tempTable.Select(null, null, System.Data.DataViewRowState.Added);
                DataRow[] modifyRows = tempTable.Select(null, null, System.Data.DataViewRowState.ModifiedOriginal);
                OleDbCommandBuilder oraCommandBuilder = new OleDbCommandBuilder(adapter) { SetAllValues = true };
                adapter.InsertCommand = oraCommandBuilder.GetInsertCommand();
                adapter.Update(addedRows);

                Log.Info(string.Format("往表 {0} 插入了 {1} 条数据,更新了{2}条数据", syncDataTable.TargetTableName,addedRows.Length,modifyRows.Length));
            }
            catch (Exception ex)
            {
                Log.Error("数据处理异常。表名: " + syncDataTable.TableName, ex);
                throw;
            }
            finally
            {
                if (command != null) command.Dispose();
            }
        }

 

 

posted @ 2011-10-25 16:43  SEEK/THINKING  阅读(1522)  评论(0编辑  收藏  举报