2

データベースからのレコードをウィンドウに表示し、数秒ごとにデータベースの新しいレコードをチェックするアプリケーションを構築しました。問題は、新しいレコードをチェックするたびにウィンドウが点滅することです。これを修正したいと考えています。古いデータテーブルと新しいデータテーブルを比較して、異なる場合にのみ更新しようとしました。そのような場合のベストプラクティスは何ですか?次の方法で実行しようとしましたが、うまくいきません。

private bool GetBelongingMessages()
        {
            bool result = false;
            DataTable dtTemp = OleDbWorks.GetBelongingMessages(currentCallID);
            if(dtTemp != dtMessages)
            {
                dtMessages = dtTemp;
                result = true;
            }
            else
            {
                result = false;
            }
            return result;
        }
4

4 に答える 4

2

まず、コードで比較しているのはデータテーブルの内容ではなく、データテーブルの参照であることを認識することが重要です。両方のデータテーブルの内容が同じかどうかを判断するには、すべての行と列をループして、それらが等しいかどうかを確認する必要があります。

//This assumes the datatables have the same schema...
        public bool DatatablesAreSame(DataTable t1, DataTable t2) {         
            if (t1.Rows.Count != t2.Rows.Count)
                return false;

            foreach (DataColumn dc in t1.Columns) {
                for (int i = 0; i < t1.Rows.Count; i++) {
                    if (t1.Rows[i][dc.ColumnName] != t2.Rows[i][dc.ColumnName]) {
                        return false;
                    }
                }
            }
            return true;
        }
于 2008-10-25T15:30:15.150 に答える
1

私はしばらく DataTable の比較を行う方法を見つけようとしてきましたが、最終的には独自の関数を作成しました。これが得られたものです。

bool tablesAreIdentical = true;

// loop through first table
foreach (DataRow row in firstTable.Rows)
{
    foundIdenticalRow = false;

    // loop through tempTable to find an identical row
    foreach (DataRow tempRow in tempTable.Rows)
    {
        allFieldsAreIdentical = true;

        // compare fields, if any fields are different move on to next row in tempTable
        for (int i = 0; i < row.ItemArray.Length && allFieldsAreIdentical; i++)
        {
            if (!row[i].Equals(tempRow[i]))
            {
                allFieldsAreIdentical = false;
            }
        }

        // if an identical row is found, remove this row from tempTable 
        //  (in case of duplicated row exist in firstTable, so tempTable needs
        //   to have the same number of duplicated rows to be considered equivalent)
        // and move on to next row in firstTable
        if (allFieldsAreIdentical)
        {
            tempTable.Rows.Remove(tempRow);
            foundIdenticalRow = true;
            break;
        }
    }
    // if no identical row is found for current row in firstTable, 
    // the two tables are different
    if (!foundIdenticalRow)
    {
        tablesAreIdentical = false;
        break;
    }
}

return tablesAreIdentical;

Dave Markle のソリューションと比較すると、私の場合は、レコードが同じで順序が異なる 2 つのテーブルを同一のものとして扱います。これが、このスレッドに再び出くわした人に役立つことを願っています.

于 2009-04-17T19:35:13.163 に答える
0

オブジェクトt1.Rows[i][dc.ColumnName]とt1.Rows[i][dc.ColumnName]をキャストする必要があります。それ以外の場合は、ステートメントt1.Rows [i] [dc.ColumnName]!= t2.Rows [i] [dc.ColumnName]は常にtrueです。次のようにコードを変更しました。

for(int i = 0; i < t1.Rows.Count; i++)
            {
                if((string)t1.Rows[i][1] != (string)t2.Rows[i][1])
                    return false;
            }

それは機能しますが、エレガントなソリューションではありません。

于 2008-10-25T16:10:35.797 に答える
0
 public Boolean CompareDataTables(DataTable table1, DataTable table2)
   {
       bool flag = true;
       DataRow[] row3 = table2.Select();
       int i = 0;// row3.Length;
       if (table1.Rows.Count == table2.Rows.Count)
       {
           foreach (DataRow row1 in table1.Rows)
           {
               if (!row1.ItemArray.SequenceEqual(row3[i].ItemArray))
               {
                   flag = false;
                   break;
               }
               i++;
           }

       }
       else
       {
           flag = false;
       }
       return flag;
   }

// ここで、この関数は結果として boolean を返し、両方が同じ場合は true を返し、両方が同じでない場合は false を返します

于 2013-08-30T05:53:00.113 に答える