Как сохранить удаленный RowState через слияния DataSet? - PullRequest
0 голосов
/ 06 мая 2011

Обратите внимание на следующую ситуацию:

  • DataSet A содержит текущий набор данных, найденных в некотором источнике данных.
  • DataSet B содержит будущие изменения данных, найденных в A , которые еще не были применены к A .

С использованием метода .NET * DataSet.Merge(DataSet),мы можем применить B к A , создав новый набор данных C , то есть C = A.Merge(B).

Проблема с объединением DataSet.Merge(DataSet)Метод заключается в том, что для любой строки r , которая помечена как удаленная в B , r будет помечена как измененная в C .Хотя ясно, что r в C также следует пометить как удаленный.

Решение, которое будет работать, но я нахожу непривлекательным, состоит в том, чтобы вручную перечислить все удаленные строки в B, и используйте их идентификатор, чтобы найти ту же строку в C , после чего изменив RowState этой строки в C на Deleted.

Что быбыть правильным решением вышеуказанной проблемы?

1 Ответ

2 голосов
/ 08 мая 2011

Я играл с наборами данных и придумал демокод ниже (на основе MSDN ), чтобы протестировать некоторые вещи, которые вы просите.(.net framework 4.0 VS2010)

Я обнаружил, что слияние недействительно, поэтому при рассмотрении вашего вопроса у нас есть A.Merge (B) и A объединены с B.

Обычное слияние(без флага preserveChanges) делает B ведущим, поэтому, когда что-то удаляется в B и оно присутствует в A, оно также будет удаляться в новом A. Если я правильно прочитал ваш вопрос, это поведение, которое вам нужно.(testoutput A)

Если вы установили флаг preservechanges в True, то странные вещи начинают происходить, например, удаленный флаг будет изменен в новом A. (testoutput B)

Если для флага preservechnages установлено значение true, установите для него значение false.Насколько я могу судить, поведение по умолчанию - это то, что вы хотите, а вы - не то, что вы видите.Я подозреваю, что что-то не так, надеюсь, это поможет вам в правильном направлении

private static void DemonstrateMergeTable()
    {
        // Create a DataSet with one table, two columns, and data.
        DataSet originalDataSet = new DataSet("dataSet");
        DataSet mergeDataSet = new DataSet("mergeSet");

        DataTable originalTable = CreateItemsTable(originalDataSet);
        DataTable mergeTable = CreateTableToMergeWith(originalTable, mergeDataSet);

        CreateTestSets(originalTable, mergeTable);

        PrintValues(originalDataSet, "Original values");
        PrintValues(mergeDataSet, "Table to merge with");

        // Merge the table into the DataSet
        Console.WriteLine("Merging");
        //originalDataSet.Merge(mergeTable,false,MissingSchemaAction.Add);
        //originalDataSet.Merge(mergeTable,true, MissingSchemaAction.Add);
        originalDataSet.Merge(mergeTable);
        PrintValues(originalDataSet, "Merged With table.");
    }

    private static void CreateTestSets(DataTable originalTable, DataTable mergeTable)
    {
        // a new row to the mergetable, no matching row in the original
        mergeTable.Rows.Add(new Object[] { 30, 0 });

        //deletedRow in original, added row in mergetable
        originalTable.Rows[0].Delete(); //id = 0
        mergeTable.Rows.Add(new Object[] { 0, 100 });

        //deletedRow in mergeset, corresponding row in original
        mergeTable.Rows[0].Delete(); //id = 5

        //deletedRow in original, corrosponding row in merging
        originalTable.Rows[6].Delete();
    }

    private static DataTable CreateItemsTable(DataSet dataSet)
    {
        DataTable table = new DataTable("Items");

        // Add columns
        DataColumn c1 = new DataColumn("id",
                                       Type.GetType("System.Int32"), "");
        DataColumn c2 = new DataColumn("Item",
                                       Type.GetType("System.Int32"), "");
        table.Columns.Add(c1);
        table.Columns.Add(c2);

        // DataColumn array to set primary key.
        DataColumn[] keyCol = new DataColumn[1];

        // Set primary key column.
        keyCol[0] = c1;
        table.PrimaryKey = keyCol;

        // Add rows.
        for (int i = 0; i < 10; i++)
        {
            DataRow row = table.NewRow();
            row["id"] = i;
            row["Item"] = i;
            table.Rows.Add(row);
        }
        // Add table to the DataSet
        dataSet.Tables.Add(table);

        // Accept changes.
        dataSet.AcceptChanges();
        return table;
    }

    private static DataTable CreateTableToMergeWith(DataTable table, DataSet mergeSet)
    {
        DataTable t2 = table.Clone();
        // Add rows.
        for (int i = 5; i < 15; i++)
        {
            DataRow row = t2.NewRow();
            row["id"] = i;
            row["Item"] = i;
            t2.Rows.Add(row);
        }

        mergeSet.Tables.Add(t2);

        t2.AcceptChanges();

        return t2;
    }

    private static void PrintValues(DataSet dataSet, string label)
    {
        Console.WriteLine("\n" + label);
        foreach (DataTable table in dataSet.Tables)
        {
            PrintTable(table);
        }
    }

    private static void PrintTable(DataTable table)
    {
        Console.WriteLine("TableName: " + table.TableName);
        foreach (DataRow row in table.Rows)
        {
            DataRowState dataRowState = row.RowState;
            foreach (DataColumn column in table.Columns)
            {
                string columnName = column.ColumnName;
                Object o = dataRowState != DataRowState.Deleted ? row[column] : row[column, DataRowVersion.Original];
                Console.Write("\t {0} \t:{1}",columnName, o);
            }
            Console.Write("\t ({0})", dataRowState);
            Console.WriteLine();
        }
    }

TestOutput A (preservechanges = false)

Original values
TableName: Items
         id     :0       Item   :0       (Deleted)
         id     :1       Item   :1       (Unchanged)
         id     :2       Item   :2       (Unchanged)
         id     :3       Item   :3       (Unchanged)
         id     :4       Item   :4       (Unchanged)
         id     :5       Item   :5       (Unchanged)
         id     :6       Item   :6       (Deleted)
         id     :7       Item   :7       (Unchanged)
         id     :8       Item   :8       (Unchanged)
         id     :9       Item   :9       (Unchanged)

Table to merge with
TableName: Items
         id     :5       Item   :5       (Deleted)
         id     :6       Item   :6       (Unchanged)
         id     :7       Item   :7       (Unchanged)
         id     :8       Item   :8       (Unchanged)
         id     :9       Item   :9       (Unchanged)
         id     :10      Item   :10      (Unchanged)
         id     :11      Item   :11      (Unchanged)
         id     :12      Item   :12      (Unchanged)
         id     :13      Item   :13      (Unchanged)
         id     :14      Item   :14      (Unchanged)
         id     :30      Item   :0       (Added)
         id     :0       Item   :100     (Added)
Merging

Merged With table.
TableName: Items
         id     :0       Item   :100     (Modified)
         id     :1       Item   :1       (Unchanged)
         id     :2       Item   :2       (Unchanged)
         id     :3       Item   :3       (Unchanged)
         id     :4       Item   :4       (Unchanged)
         id     :5       Item   :5       (Deleted)
         id     :6       Item   :6       (Modified)
         id     :7       Item   :7       (Unchanged)
         id     :8       Item   :8       (Unchanged)
         id     :9       Item   :9       (Unchanged)
         id     :10      Item   :10      (Unchanged)
         id     :11      Item   :11      (Unchanged)
         id     :12      Item   :12      (Unchanged)
         id     :13      Item   :13      (Unchanged)
         id     :14      Item   :14      (Unchanged)
         id     :30      Item   :0       (Added)

Тестовый вывод B (с preservechangesк истине)

Original values
TableName: Items
         id     :0       Item   :0       (Deleted)
         id     :1       Item   :1       (Unchanged)
         id     :2       Item   :2       (Unchanged)
         id     :3       Item   :3       (Unchanged)
         id     :4       Item   :4       (Unchanged)
         id     :5       Item   :5       (Unchanged)
         id     :6       Item   :6       (Deleted)
         id     :7       Item   :7       (Unchanged)
         id     :8       Item   :8       (Unchanged)
         id     :9       Item   :9       (Unchanged)

Table to merge with
TableName: Items
         id     :5       Item   :5       (Deleted)
         id     :6       Item   :6       (Unchanged)
         id     :7       Item   :7       (Unchanged)
         id     :8       Item   :8       (Unchanged)
         id     :9       Item   :9       (Unchanged)
         id     :10      Item   :10      (Unchanged)
         id     :11      Item   :11      (Unchanged)
         id     :12      Item   :12      (Unchanged)
         id     :13      Item   :13      (Unchanged)
         id     :14      Item   :14      (Unchanged)
         id     :30      Item   :0       (Added)
         id     :0       Item   :100     (Added)
Merging

Merged With table.
TableName: Items
         id     :0       Item   :0       (Deleted)
         id     :1       Item   :1       (Unchanged)
         id     :2       Item   :2       (Unchanged)
         id     :3       Item   :3       (Unchanged)
         id     :4       Item   :4       (Unchanged)
         id     :5       Item   :5       (Modified)
         id     :6       Item   :6       (Deleted)
         id     :7       Item   :7       (Modified)
         id     :8       Item   :8       (Modified)
         id     :9       Item   :9       (Modified)
         id     :10      Item   :10      (Unchanged)
         id     :11      Item   :11      (Unchanged)
         id     :12      Item   :12      (Unchanged)
         id     :13      Item   :13      (Unchanged)
         id     :14      Item   :14      (Unchanged)
         id     :30      Item   :0       (Added)
...