أنت غير متصل حاليًا، وفي انتظار الإنترنت الخاص بك ليقوم بإعادة الاتصال

FIX: البيانات المقترنة مع أحد مكونات التي تستخدم كائن System.Data احتمال تلف في أحد تطبيقات التي تستند إلى Microsoft .NET Framework 2.0

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

اضغط هنا لرابط المقالة باللغة الانجليزية932491
الأعراض
عند محاولة استخدام مكون في أحد تطبيقات التي تستند إلى Microsoft .NET Framework 2.0 البيانات المقترنة مع المكون قد تتلف. تحدث هذه المشكلة عند استخدام المكون كائن System.Data.DataSet. عند حدوث هذه المشكلة، قد يواجهك واحد أو أكثر من المشكلات التالية:
  • عندما يتم استدعاء أسلوب AcceptChanges في فئة DataView إدارة سجل قد تتلف.
  • قد لا يتم تحديث القيم المحسوبة في عمود تعبير بشكل صحيح.
  • عندما يتم استدعاء أسلوب DataTable.Select باستخدام عبارات متعددة قد يتم إرجاع نتيجة غير صحيحة.
  • قد تتلف فهرس داخلي للكائن DataTable. بالإضافة إلى ذلك، تظهر رسالة خطأ '13'.
  • عند حدوث عملية دمج إدارة سجل قد تتلف إذا كان الصف الهدف في حالة التحرير.
  • قد تتلف فهرس داخلي للكائن DataTable. بالإضافة إلى ذلك، تظهر رسالة خطأ '5'.
الحل

معلومات الإصلاح العاجل



يتوفر إصلاح عاجل معتمد من Microsoft. ولكن الغرض منه هو حل المشكلة الموضحة في هذه المقالة. تطبيق هذا الإصلاح العاجل فقط على الأنظمة التي تواجه هذه المشكلة بالتحديد. قد يتم إجراء اختبارات إضافية على هذا الإصلاح العاجل. ولذلك، إذا لم يكن تأثير هذه المشكلة كبيرًا، نوصي بالانتظار حتى الإصدار التالي من تحديث البرنامج الذي يحتوي على هذا الإصلاح العاجل.

لتنزيل هذا الإصلاح العاجل من معرض رمز MSDN قم بزيارة موقع Microsoft التالي على الويب:

ملاحظة يعرض المعرض رمز MSDN اللغات التي يتوفر الإصلاح الجديد. إذا لم تشاهد اللغة الخاصة بك سرد يكون ذلك بسبب صفحة المورد معرض رمز غير متوفرة لتلك اللغة.

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

المتطلبات الأساسية

لا توجد أية متطلبات مسبقة لتثبيت هذا الإصلاح العاجل.

متطلب إعادة تشغيل

ليس لديك إلى إعادة تشغيل جهاز الكمبيوتر بعد تطبيق هذا الإصلاح العاجل.

معلومات استبدال الإصلاح العاجل

لا يحل هذا الإصلاح العاجل محل أية إصلاحات جديدة أخرى.

معلومات الملف

يحتوي إصدار اللغة الإنجليزية من هذا الإصلاح العاجل سمات الملف (أو أحدث منها) المسردة في الجدول التالي. يتم سرد التواريخ والأوقات الخاصة بهذه الملفات في "حسب التوقيت العالمي" (UTC). عندما تقوم بعرض معلومات الملف، يتم تحويلها إلى التوقيت المحلي. لمعرفة الفرق بين التوقيت العالمي (UTC) والتوقيت المحلي، استخدم علامة التبويب المنطقة الزمنية في عنصر التاريخ والوقت في "لوحة التحكم".
للحصول على أجهزة الكمبيوتر المستندة إلى x86 x
اسم الملفإصدار الملفحجم الملفتاريخالوقتالنظام الأساسي
Mscordacwks.dll2.0.50727.802802,304٠٣ فبراير ٢٠٠٧11: 22x 86
Mscorjit.dll2.0.50727.802326,656٠٣ فبراير ٢٠٠٧11: 22x 86
Mscorlib.dll2.0.50727.8024,308,992٠٣ فبراير ٢٠٠٧11: 22x 86
Mscorpe.dll2.0.50727.802102,912٠٣ فبراير ٢٠٠٧11: 22x 86
Mscorwks.dll2.0.50727.8025,625,344٠٣ فبراير ٢٠٠٧11: 21x 86
Normalization.dll2.0.50727.80215,360٠٣ فبراير ٢٠٠٧11: 22x 86
Normidna.nlpغير قابل للتطبيق59,342٠٣ فبراير ٢٠٠٧11: 22غير قابل للتطبيق
Normnfc.nlpغير قابل للتطبيق45,794٠٣ فبراير ٢٠٠٧11: 22غير قابل للتطبيق
Normnfd.nlpغير قابل للتطبيق39,284٠٣ فبراير ٢٠٠٧11: 22غير قابل للتطبيق
Normnfkc.nlpغير قابل للتطبيق66,384٠٣ فبراير ٢٠٠٧11: 22غير قابل للتطبيق
Normnfkd.nlpغير قابل للتطبيق60,294٠٣ فبراير ٢٠٠٧11: 22غير قابل للتطبيق
Peverify.dll2.0.50727.802136,192٠٣ فبراير ٢٠٠٧11: 21x 86
Sos.dll2.0.50727.802382,464٠٣ فبراير ٢٠٠٧11: 22x 86
System.data.dll2.0.50727.8022,902,016٠٣ فبراير ٢٠٠٧11: 22x 86
System.data.oracleclient.dll2.0.50727.802482,304٠٣ فبراير ٢٠٠٧11: 22x 86
Vsavb7rt.dll8.0.50727.8021,330,688٠٣ فبراير ٢٠٠٧11: 21x 86
بالنسبة لأجهزة الكمبيوتر التي تستند إلى 64 x
اسم الملفإصدار الملفحجم الملفتاريخالوقتالنظام الأساسي
Mscordacwks.dll2.0.50727.8021,597,440٠٣ فبراير ٢٠٠٧03: 14x 64
Mscordacwks.dll2.0.50727.802802,304٠٣ فبراير ٢٠٠٧11: 22x 86
Mscorjit.dll2.0.50727.8021,587,712٠٣ فبراير ٢٠٠٧03: 13x 64
Mscorjit.dll2.0.50727.802326,656٠٣ فبراير ٢٠٠٧11: 22x 86
Mscorlib.dll2.0.50727.8023,960,832٠٣ فبراير ٢٠٠٧06: 28x 64
Mscorlib.dll2.0.50727.8024,308,992٠٣ فبراير ٢٠٠٧11: 22x 86
Mscorpe.dll2.0.50727.802157,184٠٣ فبراير ٢٠٠٧٠٣: ٠٧x 64
Mscorpe.dll2.0.50727.802102,912٠٣ فبراير ٢٠٠٧11: 22x 86
Mscorpjt.dll2.0.50727.8022,004,992٠٣ فبراير ٢٠٠٧03: 13x 64
Normalization.dll2.0.50727.80218,432٠٣ فبراير ٢٠٠٧03: 12x 64
Normalization.dll2.0.50727.80215,360٠٣ فبراير ٢٠٠٧11: 22x 86
Normidna.nlpغير قابل للتطبيق59,342٠٣ فبراير ٢٠٠٧03: 14غير قابل للتطبيق
Normidna.nlpغير قابل للتطبيق59,342٠٣ فبراير ٢٠٠٧11: 22غير قابل للتطبيق
Normnfc.nlpغير قابل للتطبيق45,794٠٣ فبراير ٢٠٠٧03: 14غير قابل للتطبيق
Normnfc.nlpغير قابل للتطبيق45,794٠٣ فبراير ٢٠٠٧11: 22غير قابل للتطبيق
Normnfd.nlpغير قابل للتطبيق39,284٠٣ فبراير ٢٠٠٧03: 14غير قابل للتطبيق
Normnfd.nlpغير قابل للتطبيق39,284٠٣ فبراير ٢٠٠٧11: 22غير قابل للتطبيق
Normnfkc.nlpغير قابل للتطبيق66,384٠٣ فبراير ٢٠٠٧03: 14غير قابل للتطبيق
Normnfkc.nlpغير قابل للتطبيق66,384٠٣ فبراير ٢٠٠٧11: 22غير قابل للتطبيق
Normnfkd.nlpغير قابل للتطبيق60,294٠٣ فبراير ٢٠٠٧03: 14غير قابل للتطبيق
Normnfkd.nlpغير قابل للتطبيق60,294٠٣ فبراير ٢٠٠٧11: 22غير قابل للتطبيق
Peverify.dll2.0.50727.802136,192٠٣ فبراير ٢٠٠٧11: 21x 86
Peverify.nlp2.0.50727.802205,824٠٣ فبراير ٢٠٠٧03: 13غير قابل للتطبيق
Sos.dll2.0.50727.802480,768٠٣ فبراير ٢٠٠٧٠٣: ٢٢x 64
Sos.dll2.0.50727.802382,464٠٣ فبراير ٢٠٠٧11: 22x 86
System.data.dll2.0.50727.8022,967,040٠٣ فبراير ٢٠٠٧06: 28x 64
System.data.dll2.0.50727.8022,902,016٠٣ فبراير ٢٠٠٧11: 22x 86
System.data.oracleclient.dll2.0.50727.802498,688٠٣ فبراير ٢٠٠٧06: 28x 64
System.data.oracleclient.dll2.0.50727.802482,304٠٣ فبراير ٢٠٠٧11: 22x 86
Mscorwks.dll2.0.50727.80210,323,456٠٣ فبراير ٢٠٠٧03: 11x 64
Mscorwks.dll2.0.50727.8025,625,344٠٣ فبراير ٢٠٠٧11: 21x 86
Vsavb7rt.dll8.0.50727.8021,330,688٠٣ فبراير ٢٠٠٧11: 21x 86
بالنسبة لأجهزة الكمبيوتر المستندة إلى Itanium
اسم الملفإصدار الملفحجم الملفتاريخالوقتالنظام الأساسي
Mscordacwks.dll2.0.50727.8022,719,232٠٣ فبراير ٢٠٠٧03: 15IA-64
Mscordacwks.dll2.0.50727.802802,304٠٣ فبراير ٢٠٠٧11: 22x 86
Mscorjit.dll2.0.50727.8022,705,920٠٣ فبراير ٢٠٠٧03: 13IA-64
Mscorjit.dll2.0.50727.802326,656٠٣ فبراير ٢٠٠٧11: 22x 86
Mscorlib.dll2.0.50727.8023,960,832٠٣ فبراير ٢٠٠٧٦: ٤٢IA-64
Mscorlib.dll2.0.50727.8024,308,992٠٣ فبراير ٢٠٠٧11: 22x 86
Mscorpe.dll2.0.50727.802313,856٠٣ فبراير ٢٠٠٧03: 06IA-64
Mscorpe.dll2.0.50727.802102,912٠٣ فبراير ٢٠٠٧11: 22x 86
Mscorpjt.dll2.0.50727.8023,501,056٠٣ فبراير ٢٠٠٧03: 14IA-64
Normalization.dll2.0.50727.80215,360٠٣ فبراير ٢٠٠٧11: 22x 86
Normalization.dll2.0.50727.80244,032٠٣ فبراير ٢٠٠٧03: 12IA-64
Fl_normidna.nlpغير قابل للتطبيق59,342٠٣ فبراير ٢٠٠٧11: 22غير قابل للتطبيق
Normidna.nlpغير قابل للتطبيق59,342٠٣ فبراير ٢٠٠٧03: 14غير قابل للتطبيق
Normnfc.nlpغير قابل للتطبيق45,794٠٣ فبراير ٢٠٠٧11: 22غير قابل للتطبيق
Normnfc.nlpغير قابل للتطبيق45,794٠٣ فبراير ٢٠٠٧03: 14غير قابل للتطبيق
Normnfd.nlpغير قابل للتطبيق39,284٠٣ فبراير ٢٠٠٧11: 22غير قابل للتطبيق
Normnfd.nlpغير قابل للتطبيق39,284٠٣ فبراير ٢٠٠٧03: 14غير قابل للتطبيق
Normnfkc.nlpغير قابل للتطبيق66,384٠٣ فبراير ٢٠٠٧11: 22غير قابل للتطبيق
Normnfkc.nlpغير قابل للتطبيق66,384٠٣ فبراير ٢٠٠٧03: 14غير قابل للتطبيق
Normnfkd.nlpغير قابل للتطبيق60,294٠٣ فبراير ٢٠٠٧11: 22غير قابل للتطبيق
Normnfkd.nlpغير قابل للتطبيق60,294٠٣ فبراير ٢٠٠٧03: 14غير قابل للتطبيق
Peverify.dll2.0.50727.802136,192٠٣ فبراير ٢٠٠٧11: 21x 86
Peverify.dll2.0.50727.802383,488٠٣ فبراير ٢٠٠٧03: 13IA-64
Sos.dll2.0.50727.802382,464٠٣ فبراير ٢٠٠٧11: 22x 86
Sos.dll2.0.50727.802862,720٠٣ فبراير ٢٠٠٧03: 23IA-64
System.data.dll2.0.50727.8022,902,016٠٣ فبراير ٢٠٠٧11: 22x 86
System.data.dll2.0.50727.8023,109,888٠٣ فبراير ٢٠٠٧٦: ٤٢IA-64
System.data.oracleclient.dll2.0.50727.802482,304٠٣ فبراير ٢٠٠٧11: 22x 86
System.data.oracleclient.dll2.0.50727.802501,760٠٣ فبراير ٢٠٠٧٦: ٤٢IA-64
Mscorwks.dll2.0.50727.8025,625,344٠٣ فبراير ٢٠٠٧11: 21x 86
Mscorwks.dll2.0.50727.80221,309,952٠٣ فبراير ٢٠٠٧03: 11IA-64
Vsavb7rt.dll8.0.50727.8021,330,688٠٣ فبراير ٢٠٠٧11: 21x 86
تصريح
أقرت Microsoft أن هذه مشكلة في منتجات Microsoft المسردة في قسم "تنطبق على".
معلومات أخرى

المشكلة الأولى: عندما يتم استدعاء أسلوب AcceptChanges في فئة DataView إدارة سجل قد تتلف

قد يحدث تلف في إدارة السجلات أثناء عملية كتابة من معالج أحداث. عند حدوث ذلك، قد يمكن رفع استثناء System.NullreferenceException. بالإضافة إلى ذلك، عندما تقوم بتنفيذ التطبيق عملية كتابة في حدث ListChanged, قد تحدث التحديثات الفهرس في الترتيب غير صحيح.

على سبيل المثال، اطلع على السيناريو التالي:
  1. You use the following code in the application:
    using System;using System.ComponentModel;using System.Data;class Test {    private static DataRow _dr = null;    private static bool _accept = false;        public static void Main()    {        try {            DataSet ds = new DataSet();            DataTable dt = ds.Tables.Add("Customers");            DataColumn c = dt.Columns.Add("Id", typeof(int));            dt.PrimaryKey = new DataColumn[] { c };            dt.Columns.Add("Name", typeof(string));            dt.Columns.Add("Age", typeof(int));                        dt.Rows.Add(new object[] { 1, "A", 10 });            dt.Rows.Add(new object[] { 2, "B", 20 });            dt.Rows.Add(new object[] { 3, "G", 30 });            dt.Rows.Add(new object[] { 4, "H", 40 });            dt.Rows.Add(new object[] { 5, "I", 50 });            ds.AcceptChanges();                                    DataView dv = new DataView(dt);            dv.Sort = "Name ASC";                                                dv.ListChanged += new ListChangedEventHandler(OnListChanged);                                    _dr = dt.Rows[4];                        _accept = true;            _dr["Name"] = "C";            _accept = false;                                    _dr["Name"] = "D";            _dr["Age"] = 55;                                                Console.WriteLine(dv[2][1]);                                } catch (Exception exc) {            Console.WriteLine(exc);        }    }        public static void OnListChanged(object sender, ListChangedEventArgs args)    {        if (_dr != null && _accept) {            _dr.AcceptChanges();        }    }}
  2. تشغيل التطبيق.
في هذا السيناريو، تظهر رسالة خطأ مشابهة لرسالة الخطأ التالية:
System.NullReferenceException: مرجع كائن لم يتم تعيينها إلى مثيل الكائن. في System.Data.DataView.IsOriginalVersion (Int32 فهرس) في System.Data.DataRowView.get_Item (Int32 ndx) في Test.Main() في c:\Work\bugs\newbug1\Test.cs:line 42
كمحاولة للتغلب على هذه المشكلة عدم تنفيذ أي عمليات الكتابة في حدث ListChanged. من الأفضل استخدام الحدث RowChanged بدلاً من الأحداث ListChanged.

مشكلة 2: القيم المحسوبة في عمود تعبير قد لا يتم تحديث بشكل صحيح

عند محاولة حساب القيم عمود التعبير في كائن DataSet العمود التعبير جزء من علاقة ، قد لا يتم تحديث قيم محسوبة من العمود التعبير بشكل صحيح. على سبيل المثال، اطلع على السيناريو التالي:
  1. You use the following code in the application:
    using System;using System.ComponentModel;using System.Data;class Test {    public static void Main()    {        try {            DataSet ds = new DataSet();            DataTable dt1 = ds.Tables.Add("T1");            dt1.Columns.Add("CustId", typeof(int));            dt1.Columns.Add("CustName", typeof(string));            DataTable dt2 = ds.Tables.Add("T2");            dt2.Columns.Add("EmpId", typeof(int));            DataColumn dcEmpName = dt2.Columns.Add("EmpName", typeof(string));            DataColumn dcMgrName = dt2.Columns.Add("MgrName", typeof(string));            DataColumn dcReports = dt2.Columns.Add("NumberOfReports", typeof(int));                        DataRelation rel1 = ds.Relations.Add("T1T2", dt1.Columns["CustId"], dt2.Columns["EmpId"], false);            DataRelation rel2 = ds.Relations.Add("T2T2", dt2.Columns["EmpName"], dt2.Columns["MgrName"], false);            dcEmpName.Expression = "Parent(T1T2).CustName";            dcMgrName.Expression = "Parent(T1T2).CustName";             //Each person is a manager to himself.            dcReports.Expression = "Count(Child(T2T2).EmpName)";             AddRow(dt1, 1, "N1");            AddRow(dt1, 2, "N2");            AddRow(dt1, 3, "N3");            AddRow(dt2, 1);            AddRow(dt2, 2);            AddRow(dt2, 3);            Console.WriteLine(ds.GetXml());            dt1.Rows[0]["CustName"] = "N4";            Console.WriteLine(ds.GetXml());        } catch (Exception exc) {            Console.WriteLine(exc);        }    }    public static void AddRow(DataTable dt, params object[] objArr)    {        Console.WriteLine("Adding row to table {0}", dt.TableName);        dt.Rows.Add(objArr);    }}
  2. تشغيل التطبيق.
في هذا السيناريو، تظهر الإخراج التالي:
<NewDataSet> <T1>   <CustId>1</CustId>   <CustName>N4</CustName> </T1> <T1>   <CustId>2</CustId>   <CustName>N2</CustName> </T1> <T1>   <CustId>3</CustId>   <CustName>N3</CustName> </T1> <T2>   <EmpId>1</EmpId>   <EmpName>N4</EmpName>   <MgrName>N4</MgrName>   <NumberOfReports>0</NumberOfReports>  </T2> <T2>   <EmpId>2</EmpId>   <EmpName>N2</EmpName>   <MgrName>N2</MgrName>   <NumberOfReports>1</NumberOfReports> </T2> <T2>   <EmpId>3</EmpId>   <EmpName>N3</EmpName>   <MgrName>N3</MgrName>   <NumberOfReports>1</NumberOfReports> </T2></NewDataSet>
في إخراج هذا العنصر NumberOfReports في أول عنصر T2 على القيمة غير صحيحة من 0 بدلاً من 1.

مشكلة 3: عندما يتم استدعاء أسلوب DataTable.Select باستخدام عبارات متعددة نتيجة غير صحيحة قد يتم إرجاع

عند استخدام أسلوب تحديد كائن DataTable مع جملة AND لاسترداد بيانات عبارات متعددة قد أسلوب تحديد بإرجاع نتيجة غير صحيحة. على سبيل المثال، تقوم التعليمات البرمجية التالية بإرجاع نتيجة غير صحيحة:
string filter = "(NOT ColTwo = 1) AND (ColOne = 2)";DataTable.Select(filter);
ولكن ، التعليمة البرمجية التالية بإرجاع النتيجة الصحيحة:
string filter = "NOT ColTwo = 1 AND ColOne = 2";DataTable.Select(filter);
بالإضافة إلى ذلك، اطلع على السيناريو التالي:
  1. You use the following code in the application:
    public static void Main(){  DataTable table = new DataTable();  table.Columns.Add("ColID", typeof(int));  table.Columns.Add("ColOne", typeof(int));  table.Columns.Add("ColTwo", typeof(int));  table.Rows.Add(new object[] { 1, 1, 1 });  table.Rows.Add(new object[] { 2, 1, 2 });  table.Rows.Add(new object[] { 3, 2, 1 });  table.Rows.Add(new object[] { 4, 2, 2 });  string[] queries = new string[] {      "(NOT ColTwo = 1) AND (ColOne = 2)",      "(ColOne = 2) AND (NOT ColTwo = 1)",      "NOT ColTwo = 1 AND ColOne = 2",      "ColOne = 2 AND NOT ColTwo = 1",      "NOT ColTwo = 1 AND (ColOne = 2)",      "(ColOne = 2) AND NOT ColTwo = 1",      "(NOT ColTwo = 1) AND ColOne = 2",      "ColOne = 2 AND (NOT ColTwo = 1)",  };  Console.WriteLine("Select");  foreach(string query in queries) {      DataRow[] rows = table.Select(query);      Console.WriteLine("query=\"{0}\" count={1}", query, rows.Length);      foreach(DataRow row in rows) {          Console.WriteLine("\t{0}, {1}, {2}", row[0], row[1], row[2]);      }  }}
  2. تشغيل التطبيق.
In this scenario, you receive the following output:
query="(NOT ColTwo = 1) AND (ColOne = 2)" count=2        3, 2, 1        4, 2, 2query="(ColOne = 2) AND (NOT ColTwo = 1)" count=1        4, 2, 2query="NOT ColTwo = 1 AND ColOne = 2" count=1        4, 2, 2query="ColOne = 2 AND NOT ColTwo = 1" count=1        4, 2, 2query="NOT ColTwo = 1 AND (ColOne = 2)" count=2        3, 2, 1        4, 2, 2query="(ColOne = 2) AND NOT ColTwo = 1" count=1        4, 2, 2query="(NOT ColTwo = 1) AND ColOne = 2" count=1        4, 2, 2query="ColOne = 2 AND (NOT ColTwo = 1)" count=1        4, 2, 2
In this output, "(ColOne = 2)" is incorrectly displayed on the right side of an AND clause.

مشكلة 4: رقم فهرس داخلي DataTable قد تتلف وظهور رسالة خطأ '13'

عند محاولة استخدام أسلوب AcceptChanges الكائن DataSet المستخدمة من قبل الكائن DataTable وتعيين قاعدة ForeignKey إلى AcceptRule.Cascade قيم الفهرس الداخلية التي يستخدمها الكائن DataSet قد تتلف. تحدث هذه المشكلة إذا تحققت الحالتين التاليتين:
  • يحتوي الكائن DataSet على جدول واحد أو أكثر التي لها علاقات رأس واحد.
  • يتم استدعاء أسلوب AcceptChanges الكائن DataSet.
  • يتم تعيين القيمة AcceptRejectRule الكائن DataSet إلى تتالي. عند تعيين هذه القيمة إلى تتالي يتم تغيير الجدول التابع بحيث تلقائياً إما يقبل بيانات أو يرفض البيانات.
على سبيل المثال، اطلع على السيناريو التالي:
  1. You use the following code in the application:
    public void Main(){			DataTable Table = new DataTable("Employee");			Table.Columns.Add("Id", typeof(int));			Table.Columns.Add("ManagerId", typeof(int));			Table.Columns.Add("Name", typeof(string));			Table.Columns["Name"].AllowDBNull = false;			Table.PrimaryKey = new DataColumn[] {Table.Columns["Id"]};			DataSet Employees = new DataSet();			Employees.Tables.Add(Table);			DataRelation rel = Employees.Relations.Add(Table.Columns["ID"], Table.Columns["ManagerId"]);			rel.ChildKeyConstraint.AcceptRejectRule = AcceptRejectRule.Cascade;			DataRow ManagerA = Table.NewRow();			ManagerA["ID"] = 2019;			ManagerA["Name"] = "Manager A";			Table.Rows.Add(ManagerA);			DataRow ManagerB = Table.NewRow();			ManagerB["ID"] = 392;			ManagerB["Name"] = "Manager B";			Table.Rows.Add(ManagerB);			DataRow EmployeeB = Table.NewRow();			EmployeeB["ID"] = 716;			EmployeeB["Name"] = "Employee of B";			EmployeeB.SetParentRow(ManagerB);			Table.Rows.Add(EmployeeB);			EmployeeB = Table.NewRow();			EmployeeB["ID"] = 637;			EmployeeB["Name"] = "2nd employee of B";			EmployeeB.SetParentRow(ManagerB);			Table.Rows.Add(EmployeeB);			Employees.AcceptChanges();			Table.Rows.Find(392).Delete();			Employees.AcceptChanges();}
  2. تشغيل التطبيق.
في هذا السيناريو، تظهر رسالة الخطأ التالية:
فهرس DataTable الداخلية تالفة: '13'.

مشكلة 5: عند حدوث عملية دمج إدارة سجل قد تتلف إذا كان الصف الهدف في حالة التحرير

في حال صف واحد أو أكثر في كائن DataTable جارياً ، ومن ثم حدوث عملية DataTable.Merge أو حدوث عملية DataSet.Merge إدارة سجل الكائن DataSet الكائن DataTable قد تتلف.

ملاحظة عندما يتم تحرير صف في كائن DataTable ، يتم تعيين القيمة DataRowVersion الصف إلى الاقتراح.

على سبيل المثال، اطلع على السيناريو التالي:
  1. You use the following code in the application:
    using System;using System.Data;using System.Collections.Generic;using System.Text;namespace ConsoleApplication1{    class Program    {        static void Main(string[] args)        {            DataSet set = new DataSet();            DataTable table = set.Tables.Add("table");            table.Columns.Add("C1", typeof(int));            table.Columns.Add("C2", typeof(char));            table.PrimaryKey = new DataColumn[] { table.Columns[0] };            for (int i = 0; i < 26; ++i)            {                table.Rows.Add(new object[] { i, (char)((ushort)'a' + i) });            }            table.AcceptChanges();            DataSet clone = set.Copy();            clone.Tables[0].Rows[0][1] = 'Z';            //clone.AcceptChanges();            table.Rows[0][1] = '1';            table.Rows[0].BeginEdit();            table.Rows[0][1] = '2';            try            {                set.Merge(clone);            }            finally            {               foreach (DataRow row in table.Rows) {																	Console.WriteLine("{0}={1}", row[0], row[1]);															}            }        }    }}
  2. تشغيل التطبيق.
في هذا السيناريو، يكون إدارة سجل الكائن DataSet الكائن DataTable تالف.

كمحاولة للتغلب على هذه المشكلة تأكد من وجود أية صفوف في الكائن DataSet الوجهة التي تحتوي على مجموعة قيمة DataRowVersion إلى الاقتراح قبل استخدام أسلوب DataTable.Merge أو أسلوب DataSet.Merge.

مشكلة 6: الفهرس داخلي كائن DataTable قد تتلف وظهور رسالة خطأ '5'

تتسبب السيناريوهات التالية تلف في كائن DataTable بتغيير البيانات في كائن DataTable دون تحديث الفهارس داخلي الكائن DataTable:
  1. يتم تغيير القيمة DataColumn.Expression من تعبير إلى لم تعبير. في هذا السيناريو، يتم تعيين كافة البيانات في كائن DataColumn إلى DBNull.
  2. عندما يتم استدعاء أسلوب DataTable.Clear تتم إزالة كافة البيانات في كائن DataTable ثم يتم تحديث الفهارس. ومع ذلك، لا يتم تحديث جداول أخرى الإشارة كائن DataTable.
على سبيل المثال، اطلع على السيناريو التالي:
  1. You use the following code in the application:
    using System;using System.Data;using System.Collections.Generic;using System.Text;namespace ConsoleApplication1{    class Program    {        static void Main(string[] args)        {            DataSet set = new DataSet("s");            DataTable table1 = set.Tables.Add("a");            table1.Columns.Add("C1", typeof(int));            table1.Columns.Add("C2", typeof(int));            table1.DefaultView.Sort = "C2";            DataTable table2 = set.Tables.Add("b");            table2.Columns.Add("C1", typeof(int));            table2.Columns.Add("C2", typeof(int));            table2.DefaultView.Sort = "C2";            set.Relations.Add(new DataRelation("t1t2", table1.Columns[0], table2.Columns[0], false));            table1.Columns[1].Expression = "Sum(Child(t1t2).C2)";            AddData(table1, 1);            AddData(table2, 2);            table1.Columns[1].Expression = null;            AddData(table2, 2);            AddData(table1, 2);        }        private static void AddData(DataTable table, int y)        {            object[] x = new object[y];            Random rand = new Random(20070125);            for (int i = 0; i < 1000; ++i)            {                switch (rand.Next(3))                {                    case 0:                    case 1:                        for (int k = 0; k < x.Length; ++k)                        {                            x[k] = rand.Next(500);                        }                        table.Rows.Add(x);                        break;                    case 2:                        if (0 < table.Rows.Count)                        {                            table.Rows.RemoveAt(rand.Next(table.Rows.Count));                        }                        break;                }            }        }    }}
  2. تشغيل التطبيق.
في هذا السيناريو، تظهر رسالة الخطأ التالية:
فهرس DataTable الداخلية تالفة: '5'.
لمزيد من المعلومات، انقر فوق رقم المقالة التالي لعرضها في "قاعدة المعارف لـ Microsoft:
824684وصف للمصطلحات القياسية المستخدمة في وصف تحديثات برامج Microsoft

تحذير: تمت ترجمة هذه المقالة تلقائيًا

خصائص

رقم الموضوع: 932491 - آخر مراجعة: 12/03/2007 19:09:04 - المراجعة: 1.8

Microsoft .NET Framework 2.0

  • kbmt kbfix kbbug kbprb kbexpertiseinter kbexpertisebeginner kbqfe kbpubtypekc KB932491 KbMtar
تعليقات
t>