2016-04-28 8 views
0

現在、2つのテーブルの違いを持つテーブルを返すSQLコードがあります。したがって、2つのテーブル間で異なるデータを持つ行のみを持つテーブルが返されます。テーブルは異なる環境のまったく同じです。私は、SQLでロードされたDataTableから異なるデータを持つ列名をどのように返すことができるのだろうか?異なっている列知るためにDataTableの相違点を持つ列の取得

crs.DataHasChanged = ChangeState.False; 
//Compare data of two tables. 
sql = "Select 'Source Diff' as CompareDiff, " + BuildColumns(colIncludes, "C1", textColName) + " From " + sourceServer + "." + sourceDB + ".dbo." + tableStateObj.TableName + " C1 "; 
sql += "EXCEPT "; 
sql += "Select 'Source Diff' as CompareDiff, " + BuildColumns(colIncludes, "C2", textColName) + " From " + destServer + "." + destDB + ".dbo." + tableStateObj.TableName + " C2 "; 
sql += "UNION "; 
sql += "Select 'Dest Diff' as CompareDiff, " + BuildColumns(colIncludes, "C2", textColName) + " From " + destServer + "." + destDB + ".dbo." + tableStateObj.TableName + " C2 "; 
sql += "EXCEPT "; 
sql += "Select 'Dest Diff' as CompareDiff, " + BuildColumns(colIncludes, "C1", textColName) + " From " + sourceServer + "." + sourceDB + ".dbo." + tableStateObj.TableName + " C1 "; 
sql += "Order By 2,3"; 

ds = new DataSet(); 
using (SqlDataAdapter da = new SqlDataAdapter(sql, compareConnString)) 
{ 
    da.Fill(ds); 
} 
if (ds.Tables[0].Rows.Count > 0) 
{ 
    crs.DataHasChanged = ChangeState.True; 
} 
crs.DataChangeTable = ds.Tables[0]; 

答えて

0

は、私は正しい道に乗る助けたものですが、ここでは実際に私のために働いていたコードは次のとおりです。

ds = new DataSet(); 
using (SqlDataAdapter da = new SqlDataAdapter(sql, compareConnString)) 
{ 
    da.Fill(ds); 
} 
if (ds.Tables[0].Rows.Count > 0) 
{ 
    int rowCount = ds.Tables[0].Rows.Count; 
    int rowsRemaining = rowCount; 

    for (int i = 0; i < rowCount; i+=2) 
    { 
     if (!(rowsRemaining == 1)) 
     { 
      var row1 = ds.Tables[0].Rows[i]; 
      var row2 = ds.Tables[0].Rows[i + 1]; 

      if (row1[1].ToString() == row2[1].ToString()) 
      { 
       foreach (DataColumn col in ds.Tables[0].Columns) 
       { 
        if (col.ColumnName != "CompareDiff") 
        { 
         if (row1[col].ToString() != row2[col].ToString()) 
         { 
          crs.ColumnsChanged.Add(col.ColumnName); 
         } 
        } 
        } 
       } 
      } 

      rowsRemaining -= 2; 
     } 

は、おそらくそれがより効率的にするためにリファクタリングが、私でした今は結果に満足しています。うまくいけば、それはこの問題を抱えた誰かを助けるでしょう。

+0

いい仕事です!あなたが探しているものの内外を知ると簡単に! – WickedFan

0

は、あなたがそれらを読んでする必要があります。ここでは

は、DataTableには満たされます場所のほんの少しの抜粋です。 4つの組合があるようですか? 2列C1とC2を比較する。ああ。論理は理解するためにしばらく時間が必要です。以下に示された何

if (ds.Tables[0].Rows.Count > 0) 
{ 
    int rowCounts = ds.Tables[0].Rows.Count; 
    int atRowx = 0; 
    foreach(DataRow row in ds.Tables[0].Rows){ 
     atRowX ++; 
     if(atRowX = rowCounts-1) 
     break; 
     //Idea is to read two rows at a time. For each difference, either with C1 or C2, two lines are created. 
     If(rowCounts % 4 == 0){ //It found a multiple of two differences 
     //Clear up your code to keep the C1 and C2 together or else get the logic for reading row 1 and row 4 in here. 
     foreach(DataColumn column in ds.Tables[0].Columns){ 
      if(row[column] != row+1[column]) 
      Console.WriteLine(ds.Tables[0].Column.ColumnName + "\t"); 
     }else if(rowCounts % 2){ //It strictly found one difference 
     foreach(DataColumn column in ds.Tables[0].Columns){ 
      if(row[column] != row+1[column]) 
      Console.WriteLine(ds.Tables[0].Column.ColumnName + "\t"); 
     } 
    } 
    crs.DataHasChanged = ChangeState.True; 
} 
+0

このロジックは、行Xと行X + 1を比較し、それらを比較する各列を反復します。私はあなたのrsが不一致が見つかったときに少なくとも2つの行を返すと仮定しています。 – WickedFan

+0

これはうまくいきませんでしたが、正しい軌道に乗りました。 foreachループで行+ 1を実行することはできません。また、追加された行も考慮する必要がありました。だから常に偶数の行があるわけではありませんでした。だから私は私の答えを以下に掲示します。ご協力ありがとうございました! – j5juice