1

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

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

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

両方のデータテーブルを比較 (行と列) して、同じ列 (両方のデータテーブルに存在) を一意のレコード (一意の行) で取得します。

詳細を説明しましょう:

oDtServerData には、数行の列 (Column1、Column2、Column3、Column4) があります。oDtLocalSystemData には、行数の少ない列 (Column1、Column2、Column3) があります。

oDtServerData の列と oDtLocalSystemData が少なくなる可能性があります。しかし、いずれにせよ、データテーブルと一意の行の両方で一致する列(Column1、Column2、Column3)が必要です(データは一意である必要があります)。

誰かがこれで私を助けて、私の問題を解決するためのいくつかの例を教えてください。

4

2 に答える 2

3

以下のコードを使用して、2 つの DataTable を比較できます。

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

DataTable.Merge() の詳細については、MSDN の DataTable.Merge メソッド (DataTable)を参照してください。

于 2013-03-20T12:08:52.083 に答える
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;
    }
于 2013-03-25T05:55:52.067 に答える