2011-05-06 78 views
0

请考虑以下情况:如何在DataSet中保持已删除的RowState合并?

  • 的DataSet 一个包含当前设定的一些数据源中的数据。
  • 数据集包含在中找到的数据,其尚未被应用于未来的变化。

使用.NET的DataSet.Merge(DataSet)方法,我们可以应用一个,创建一个新的DataSet Ç,即C = A.Merge(B)

DataSet.Merge(DataSet)合并方法的问题是,对于任何行- [R其在R作为在Ç改性将被标记标记为已删除。很明显,C中的r也应该被标记为已删除。

的溶液,其将工作,但我发现不吸引人,是在跨越所有已删除的行手动枚举,并使用他们的标识符找到相同的行中Ç,之后改变该行中的RowState的C也被删除。

上述问题的解决方案是什么?

回答

2

我一直在玩数据集,想出了democode(根据MSDN)来测试你所要求的一些东西。看着你的问题时(.NET框架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为true)

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)