2013-03-20 48 views
1

我有2个数据表如何比较(行和列)两个数据表,并获得唯一的记录

string query = "Select * from " + ServerTableName; 
DataTable oDtSeverData = GetDataTable(query); 

string dbQuery = "SELECT * from " + LocalSystemTableName; 
DataTable oDtLocalSystemData = dataService.GetDataTable(dbQuery); 

我想比较(行和列),这两个数据表,以获得相同的列(同时存在于数据表)与唯一记录(独特的行)。

让我详细解释:

oDtServerData有几行列(列1,列2,栏3,Column4)。 oDtLocalSystemData具有几行的列(Column1,Column2,Column3)。

oDtServerData可能有较少的列和oDtLocalSystemData。但在任何情况下,我都希望列(Column1,Column2,Column3)在数据表中与唯一行匹配(数据应该是唯一的)。

有人请帮助我,并给我一些想法,用几个例子来解决我的问题。

+0

预期的表具有相同的结构,将数据插入到表?有主键吗? – Richard 2013-03-20 12:00:27

+0

表中没有主键。它是从2个不同的地方动态创建的表。但是,最大结构(列)将是相同的。 – Rocky 2013-03-20 12:03:17

+0

如果没有任何种类的键,您将被卡住迭代一个DataTable中的所有行,然后通过对数据源执行SQL查询或使用DataTable的Find方法检查它们是否存在于第二个DataTable中。两者都可能非常昂贵和缓慢。 – Richard 2013-03-20 12:06:15

回答

0
ArrayList commonColumns = new ArrayList(); 

for (int iServerColumnCount = 0; iServerColumnCount < oDtSeverData .Columns.Count; iServerColumnCount ++) 
{ 
    for (int iLocalColumnCount = 0; 
          iLocalColumnCount < oDtLocalSystemData .Columns.Count; 
          iLocalColumnCount ++) 
    { 
     if (oDtSeverData .Columns[iServerColumnCount ].ColumnName.ToString() 
      .Equals(oDtLocalSystemData .Columns[iLocalColumnCount].ColumnName.ToString())) 
     { 
     commonColumns.Add(oDtLocalSystemData .Columns[iLocalColumnCount].ColumnName.ToString()); 
     } 
    } 
} 

DataTable oDtData = CompareTwoDataTable(oDtLocalSystemData, oDtSeverData,commonColumns); 

public DataTable CompareTwoDataTable(DataTable dtOriginalTable, DataTable dtNewTable, ArrayList columnNames) 
    { 
     DataTable filterTable = new DataTable(); 
     try 
     { 
      filterTable = dtNewTable.Copy(); 
      string filterCriterial; 
      if (columnNames.Count > 0) 
      { 
       for (int iNewTableRowCount = 0; iNewTableRowCount < dtNewTable.Rows.Count; iNewTableRowCount++) 
       { 
        filterCriterial = string.Empty; 
        foreach (string colName in columnNames.ToArray()) 
        { 

         filterCriterial += "ISNULL("+colName.ToString() + ",'')='" + dtNewTable.Rows[iNewTableRowCount][colName].ToString() + "' AND "; 
        } 
        filterCriterial = filterCriterial.TrimEnd((" AND ").ToCharArray()); 
        DataRow[] dr = dtOriginalTable.Select(filterCriterial); 
        if (dr.Length > 0) 
        { 
         filterTable.Rows[filterTable.Rows.IndexOf(filterTable.Select(filterCriterial)[0])].Delete(); 
         filterTable.AcceptChanges(); 
        } 
       } 
      } 

     } 
     catch (Exception ex) 
     { 
     } 

     return filterTable; 
    } 

我想我用批量插入的,我用同样的公共列

public bool BulkInsertDataTable(string tableName, DataTable dataTable, string[] commonColumns) 
    { 
     bool isSuccuss; 
     try 
     { 

      SqlConnection SqlConnectionObj = GetSQLConnection(); 
      SqlBulkCopy bulkCopy = new SqlBulkCopy(SqlConnectionObj, SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.UseInternalTransaction, null); 
      bulkCopy.DestinationTableName = tableName; 
      bulkCopy.ColumnMappings.Clear(); 
      for (int iDtColumnCount = 0; iDtColumnCount < dataTable.Columns.Count; iDtColumnCount++) 
      { 
       for (int iArrCount = 0; iArrCount < commonColumns.Length; iArrCount++) 
       { 
        if (dataTable.Columns[iDtColumnCount].ColumnName.ToString().Equals(commonColumns[iArrCount].ToString())) 
        { 
         bulkCopy.ColumnMappings.Add(dataTable.Columns[iDtColumnCount].ColumnName.ToString(), 
                commonColumns[iArrCount].ToString()); 
        } 
       } 
      } 

      bulkCopy.WriteToServer(dataTable); 
      isSuccuss = true; 
     } 
     catch (Exception ex) 
     { 
      isSuccuss = false; 
     } 
     return isSuccuss; 
    } 
2

您可以使用下面的代码来比较两个数据表,

public static DataTable CompareTwoDataTable(DataTable dt1, DataTable dt2) 
{ 
    dt1.Merge(dt2); 
    DataTable d3 = dt2.GetChanges(); 
    return d3; 
} 

有关DataTable.Merge(详细信息),请参阅DataTable.Merge Method (DataTable) on MSDN

+0

哇,不知道合并是那么强大! – Richard 2013-03-20 12:12:26

+0

我试过了,但没有工作 – Rocky 2013-03-20 12:21:11

相关问题