سؤال

لقد قمت ببناء تطبيق يعرض السجلات من قاعدة البيانات في النافذة ويتحقق من قاعدة البيانات للحصول على سجلات جديدة كل ثوانٍ. المشكلة هي أن النافذة تومض في كل مرة أتحقق فيها من سجلات جديدة وأريد إصلاحها. لقد حاولت مقارنة DataTable القديمة مع واحد جديد والتحديث فقط إذا كانت مختلفة. هل يعرف أي شخص ما هي أفضل ممارسة لمثل هذه الحالات؟ حاولت أن أفعل ذلك بالطريقة التالية لكنه لا يعمل:

private bool GetBelongingMessages()
        {
            bool result = false;
            DataTable dtTemp = OleDbWorks.GetBelongingMessages(currentCallID);
            if(dtTemp != dtMessages)
            {
                dtMessages = dtTemp;
                result = true;
            }
            else
            {
                result = false;
            }
            return result;
        }
هل كانت مفيدة؟

المحلول

أولاً ، من المهم أن ندرك أن ما تقارنه في الكود الخاص بك هو المراجع من Datatables ، وليس محتويات من Datatables. من أجل تحديد ما إذا كان كلا dataTables لهما نفس المحتويات ، سيتعين عليك حلق جميع الصفوف والأعمدة ومعرفة ما إذا كانا متساوون:

//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;
        }

نصائح أخرى

لقد كنت أحاول إيجاد طريقة لإجراء مقارنة قابلة للتصميم لفترة من الوقت وانتهى الأمر بكتابة وظيفتي الخاصة ، إليك ما حصلت عليه:

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 ، يعامل الألغام جدولين بنفس السجلات ولكن في أوامر مختلفة متطابقة. آمل أن يساعد هذا من يتعثر على هذا الموضوع مرة أخرى.

يجب عليك إلقاء كائنات t1.rows [i] [dc.columnname] و t1.rows [i] [dc.columnname] وإلا فإن العبارة t1.rows [i] [dc.columnname]! = t2.rows [i] [dc.columnname] صحيح دائمًا. لقد قمت بتعديل الكود بالطريقة التالية:

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

وهو يعمل لكنه ليس حلاً أنيقًا.

 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;
   }

)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top