0

私は2つのDataTablesを持っています:

 DataTable OldDataTable = HttpContext.Current.Cache["oldDataTable"];

|  ID  | Value
|  1   |   0
|  2   |   0

DataTable NewDataTable =/*Get New Record Data*/

|  ID  | Value
|  1   |   0
|  2   |   1          new Value
|  3   |   0          new Row

これらの 2 つの DataTable を比較して、次のような作業を行うにはどうすればよいですか。

新しい値を警告して更新し、新しい行を に更新しoldDataTableます。

次に、別のnewDatatableものが次のように来ます。

DataTable AnotherNewDataTable =/*Get New Record Data*/

|  ID  | Value
                          no more record in ID 1
|  2   |   1          
|  3   |   0         

から行を削除しoldDataTableます。

ループを維持して新しいデータテーブルと比較するにはどうすればよいですか?

4

4 に答える 4

1

SelectプロパティをチェックDataTable

 DataRow[] result = NewDataTable.Select("ID <> '" + OldDataTable.Columns['ID'].ToString() + "'"
                + " OR" + " Value <>'" + OldDataTable.Columns['Value'].ToString() + "'");

上記のコードは、2 つの行の間で一致しない行を配列に格納します。ここでは「等しくない」という意味です。 (上記の例は、よりも多くの行があるという仮定に基づいています。)DataTablesDataRow<>
NewDataTableOldDataTable

于 2012-11-30T11:30:03.307 に答える
0

次のコードを試して、2つのデータテーブルを比較してください。

private void button1_Click(object sender, EventArgs e)   
{      
    // Something to do with the Initialization of the FirstDataTable and SecondDataTable  
    DataTable dt;  
    dt = getDifferentRecords(FirstDataTable, SecondDataTable);  

    if (dt.Rows.Count == 0)  
        MessageBox.Show("Equal");  
    else 
        MessageBox.Show("Not Equal");
}

// Compare two DataTables and return a DataTable with DifferentRecords       
/// <summary>       
/// Compare two DataTables and return a DataTable with DifferentRecords   
/// </summary>   
/// <param name="FirstDataTable">FirstDataTable</param>   
/// <param name="SecondDataTable">SecondDataTable</param>   
/// <returns>DifferentRecords</returns>

public DataTable getDifferentRecords(DataTable FirstDataTable, DataTable SecondDataTable)   
{  
    //Create Empty Table  
    DataTable ResultDataTable = new DataTable("ResultDataTable");  

    //use a Dataset to make use of a DataRelation object  
    using (DataSet ds = new DataSet())  
    {      
        //Add tables      
        ds.Tables.AddRange(new DataTable[] { FirstDataTable.Copy(), SecondDataTable.Copy()  });

        //Get Columns for DataRelation  
        DataColumn[] firstColumns = new DataColumn[ds.Tables[0].Columns.Count];  
        for (int i = 0; i < firstColumns.Length; i++)  
        {  
            firstColumns[i] = ds.Tables[0].Columns[i];  
        }  

        DataColumn[] secondColumns = new DataColumn[ds.Tables[1].Columns.Count];  
        for (int i = 0; i < secondColumns.Length; i++)  
        {  
            secondColumns[i] = ds.Tables[1].Columns[i];  
        }  

        //Create DataRelation  
        DataRelation r1 = new DataRelation(string.Empty, firstColumns, secondColumns, false);  
        ds.Relations.Add(r1);  

        DataRelation r2 = new DataRelation(string.Empty, secondColumns, firstColumns, false);  
        ds.Relations.Add(r2);  

        //Create columns for return table  
        for (int i = 0; i < FirstDataTable.Columns.Count; i++)  
        {  
            ResultDataTable.Columns.Add(FirstDataTable.Columns[i].ColumnName, FirstDataTable.Columns[i].DataType);  
        }  

        //If FirstDataTable Row not in SecondDataTable, Add to ResultDataTable.  
        ResultDataTable.BeginLoadData();  
        foreach (DataRow parentrow in ds.Tables[0].Rows)  
        {  
            DataRow[] childrows = parentrow.GetChildRows(r1);  
            if (childrows == null || childrows.Length == 0)  
                ResultDataTable.LoadDataRow(parentrow.ItemArray, true);  
        }  

        //If SecondDataTable Row not in FirstDataTable, Add to ResultDataTable.  
        foreach (DataRow parentrow in ds.Tables[1].Rows)  
        {  
          DataRow[] childrows = parentrow.GetChildRows(r2);  
          if (childrows == null || childrows.Length == 0)  
            ResultDataTable.LoadDataRow(parentrow.ItemArray, true);  
        }  
        ResultDataTable.EndLoadData();  
    }

    return ResultDataTable;   
}
于 2012-11-30T12:13:27.197 に答える
0

linq と 2 つの結合を使用すると、変更された (追加、削除、または更新された) 行の正確なセットを簡単に取得できます。完全な例を次に示します。

    class Data {
        public int ID;
        public int value;
    }

    enum RowState {
        Added,
        Updated,
        Deleted
    }

    List<Data> OldDataTable = new List<Data> { 
            new Data { ID = 1, value = 0 }, 
            new Data { ID = 2, value = 0 }, 
            new Data { ID = 3, value = 1 } 
    };
    List<Data> NewDataTable = new List<Data> { 
            new Data { ID = 1, value = 0 },
            new Data { ID = 2, value = 1 },
            new Data { ID = 4, value = 2 } 
    }; 

    void Test() {
        //updated and deleted rows
        var udRows = 
            from Old in OldDataTable
            join n in NewDataTable on Old.ID equals n.ID 
            into NewWithNullForDeleted
            from subNew in NewWithNullForDeleted.DefaultIfEmpty()
            where subNew == null || Old.value != subNew.value
            select new {
                ID = Old.ID,
                OldValue = (int?)Old.value,
                NewValue = subNew == null ? (int?)null : (int?)subNew.value,
                RowState = subNew == null ? RowState.Deleted : RowState.Updated
            };
        //added rows
        var aRows = 
            from New in NewDataTable
            join o in OldDataTable on New.ID equals o.ID 
            into OldWithNullForAdded
            from subOld in OldWithNullForAdded.DefaultIfEmpty()
            where subOld == null
            select new {
                ID = New.ID,
                OldValue = (int?)null,
                NewValue = (int?)New.value,
                RowState = RowState.Added
            };
        //merge
        var changedRows = udRows.ToList();
        changedRows.AddRange(aRows);

        //display
        foreach (var changedRow in changedRows) {
            Console.WriteLine("{0} : '{1}' -> '{2}' ({3})",
            changedRow.ID, 
            changedRow.OldValue, changedRow.NewValue,
            changedRow.RowState);
        }
    }

Testこのサンプル データでメソッドを実行すると、次のように出力されます。

2 : '0' -> '1' (Updated)
3 : '1' -> '' (Deleted)
4 : '' -> '2' (Added)

お役に立てれば。

于 2012-11-30T12:41:22.540 に答える
0

各テーブルの行をループしてから、そのループ内の各列をループして個々の値を比較する必要があります。

ここにコードサンプルがあります: 2 つのデータテーブルを比較します

要するに、メソッドは次のようになります。

bool compareTbls(Datatable OldDataTable, Datatable NewDataTable)
{
    if(OldDataTable.Rows.Count != NewDataTable.Rows.Count || OldDataTable.Columns.Count != NewDataTable.Columns.Count)
        return false;

    for(int i = 0; i < OldDataTable.Rows.Count; i++)
    {
        for(int c = 0; c < OldDataTable.Columns.Count; c++)
        {
            if(OldDataTable.Rows[i][c] != NewDataTable.Rows.Columns[i][c])
                return false;
        }
    }

    return true;
}
于 2012-11-30T11:13:45.913 に答える