zoukankan      html  css  js  c++  java
  • 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();
                }
            }

  • 相关阅读:
    git rebase解决合并冲突
    Google GMS介绍
    MTK Android修改System分区
    Adb adb push (remote write failed: No space left on device)
    Android Visibility控件显示和隐藏
    MTK Android中设置默认时区
    初级Oracle和SQL学习者的学习笔记。韩顺平-玩转oracle。
    网络知识从零开始一:私有地址。
    oracle中有关用户、角色的一些概念。
    oracle中的一些函数笔记
  • 原文地址:https://www.cnblogs.com/SEEKTHINKING/p/2224128.html
Copyright © 2011-2022 走看看