首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataAdapter不更新源

DataAdapter不更新源
EN

Stack Overflow用户
提问于 2012-08-13 10:39:12
回答 1查看 1.5K关注 0票数 0

我在使用DataAdapter时遇到了一个问题,我希望有人能帮上忙。基本上,我正在创建一个系统,如下所示:

  1. 数据从数据源(MS、Server或Excel)读取,转换为数据表,然后使用DataAdapters插入本地Server数据库。这一点很好用。SQL server表有一个PK,它是一个标识字段,其自动增量设置为on。
  2. 随后的数据加载从源读取的数据,并将其与我们已经拥有的数据进行比较。如果记录丢失,则添加它(这很好)。如果记录是不同的,那么它需要被更新(这不起作用)。
  3. 在执行差异数据加载时,我创建一个数据表,该数据表从目标表(SQL server)读取模式,并确保它具有相同的列等。
  4. 目标表中的PK为0列,因此,当插入记录时,将设置从第1列开始的所有值(正如前面提到的,这是完美的)。我不会更改我要添加的项目的行状态。数据表中的PK设置正确,我可以确认这一点。
  5. 在更新数据时,我将列0( PK列)设置为正在更新的记录的值,并将所有列设置为与源数据相同。
  6. 对于更新的记录,我在行中调用AcceptChanges和SetModified,以确保应用程序调用正确的方法。
  7. DataAdapter是使用命令生成器使用SelectCommand和UpdateCommand设置的。

当我运行时,我使用SQL分析器跟踪它,可以看到insert命令正在正确运行,但是update命令根本没有运行,这是问题的症结所在。作为参考,插入表如下所示

代码语言:javascript
复制
PK   Value1    Value 2    Row State
==   ======    =======    =========
124   Test1     Test 2    Added
123   Test3     Test4     Updated

有几件事需要注意.

  • 我已经通过将要更改的行加载到datatable中、更改一些列字段和运行update进行了测试,这是可行的。但是,对于我的解决方案来说,这是不切实际的,因为数据大于1GB,所以我不能简单地将它加载到datatable中,而不会受到很大的性能影响。我要做的是创建最多为500行的数据表,并运行Update。在初始数据加载期间的测试表明,在内存使用和性能方面,这是最有效的。每个批处理运行后,数据表将被清除。

有人知道我在哪里出了什么问题吗?

提前感谢

安德鲁

==========Update==============

下面是创建插入/更新行的代码

代码语言:javascript
复制
    private static void AddNewRecordToDataTable(DbDataReader pReader, ref DataTable pUpdateDataTable)
    {

        // create a new row in the table

        DataRow pUpdateRow = pUpdateDataTable.NewRow();

        // loop through each item in the data reader - setting all the columns apart from the PK

        for (int addCount = 0; addCount < pReader.FieldCount; addCount++)
        {
            pUpdateRow[addCount + 1] = pReader[addCount];
        }

        // add the row to the update table

        pUpdateDataTable.Rows.Add(pUpdateRow);

    }

    private static void AddUpdateRecordToDataTable(DbDataReader pReader, int pKeyValue,
                                                   ref DataTable pUpdateDataTable)
    {
        DataRow pUpdateRow = pUpdateDataTable.NewRow();

        // set the first column (PK) to the value passed in

        pUpdateRow[0] = pKeyValue;

        // loop for each row apart from the PK row

        for (int addCount = 0; addCount < pReader.FieldCount; addCount++)
        {
            pUpdateRow[addCount + 1] = pReader[addCount];
        }

        // add the row to the table and then update it

        pUpdateDataTable.Rows.Add(pUpdateRow);
        pUpdateRow.AcceptChanges();
        pUpdateRow.SetModified();
    }

以下代码用于实际执行更新:

代码语言:javascript
复制
    updateAdapter.Fill(UpdateTable);
    updateAdapter.Update(UpdateTable);
    UpdateTable.AcceptChanges();

以下内容用于创建数据表,以确保其具有与源数据相同的字段/数据类型

代码语言:javascript
复制
    private static DataTable CreateDataTable(DbDataReader pReader)
    {
        DataTable schemaTable = pReader.GetSchemaTable();
        DataTable resultTable = new DataTable(<tableName>); // edited out personal info
        // loop for each row in the schema table

        try
        {

            foreach (DataRow dataRow in schemaTable.Rows)
            {

                // create a new DataColumn object and set values depending
                // on the current DataRows values

                DataColumn dataColumn = new DataColumn();
                dataColumn.ColumnName = dataRow["ColumnName"].ToString();
                dataColumn.DataType = Type.GetType(dataRow["DataType"].ToString());
                dataColumn.ReadOnly = (bool)dataRow["IsReadOnly"];
                dataColumn.AutoIncrement = (bool)dataRow["IsAutoIncrement"];
                dataColumn.Unique = (bool)dataRow["IsUnique"];

                resultTable.Columns.Add(dataColumn);
            }
        }
        catch (Exception ex)
        {
            message = "Unable to create data table " + ex.Message;
            throw new Exception(message, ex);
        }

        return resultTable;
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-14 07:09:15

如果有人感兴趣,我确实设法解决了这个问题,但从未设法使数据适配器工作。基本上,我所做的是:

  • 创建具有索引的对象列表和作为成员的字段值列表
  • 读取已更改的行,并存储源数据中的值(即将覆盖对象中当前值的值)。此外,我还创建了索引的逗号分隔列表。
  • 完成后,我在sql语句中使用逗号分隔列表来返回行并将它们加载到数据适配器中。
  • 对于每个查询,我对索引运行一个LINQ查询,并提取新的值,更新数据集。这将行状态设置为“已修改”。
  • 然后运行更新,并正确地更新行。

这不是最快或最整洁的解决方案,但它确实有效,并且允许我以批方式运行更改。

谢谢

安德鲁

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11932672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档