การแก้ไข: ข้อมูลที่เกี่ยวข้องกับคอมโพเนนต์ที่ใช้วัตถุ System.Data อาจเสียในโปรแกรมประยุกต์ที่สร้างบน Microsoft .NET Framework 2.0

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 932491 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

อาการ

เมื่อคุณพยายามที่จะใช้คอมโพเนนต์ในโปรแกรมประยุกต์ที่สร้างบน Microsoft .NET Framework 2.0 ข้อมูลที่เกี่ยวข้องกับคอมโพเนนต์อาจเสียหายไป ปัญหานี้เกิดขึ้นเมื่อคอมโพเนนต์ใช้วัตถุSystem.Data.DataSet เมื่อปัญหานี้เกิดขึ้น คุณอาจพบปัญหาต่อไปนี้อย่างน้อยหนึ่งอย่าง:
  • เมื่อมีเรียกวิธีAcceptChangesในคลาDataViewตัวจัดการระเบียนอาจเสียหายไป
  • มีการคำนวณค่าในคอลัมน์ที่มีนิพจน์อาจไม่สามารถปรับปรุงได้อย่างถูกต้อง
  • เมื่อมีเรียกวิธีDataTable.Selectโดยใช้คำสั่งหลาย อาจได้รับผลลัพธ์ที่ไม่ถูกต้อง
  • ดัชนีภายในของDataTableวัตถุอาจเสียหายไป นอกจากนี้ คุณได้รับข้อความข้อผิดพลาด '13'
  • เมื่อต้องการดำเนินการผสานเกิดขึ้น ตัวจัดการระเบียนอาจเสียถ้าแถวเป้าหมายอยู่ในสถานะที่แก้ไข
  • ดัชนีภายในของDataTableวัตถุอาจเสียหายไป นอกจากนี้ คุณได้รับข้อความข้อผิดพลาด '5'

การแก้ไข

ข้อมูลโปรแกรมแก้ไขด่วน



มีโปรแกรมแก้ไขด่วนที่ได้รับการสนับสนุนจาก Microsoft อย่างไรก็ตาม โปรแกรมแก้ไขด่วนนี้มุ่งหวังเพื่อการแก้ไขปัญหาที่อธิบายไว้ในบทความนี้เท่านั้น ใช้โปรแกรมแก้ไขด่วนนี้เฉพาะกับระบบที่พบปัญหานี้ โปรแกรมแก้ไขด่วนนี้อาจได้รับการทดสอบเพิ่มเติม ดังนั้น ถ้าคุณจะไม่รุนแรงกระทบปัญหานี้ เราขอแนะนำให้ คุณรอการปรับปรุงซอฟต์แวร์ถัดไปที่ประกอบด้วยโปรแกรมแก้ไขด่วนนี้

เมื่อต้องดาวน์โหลดโปรแกรมแก้ไขด่วนนี้จากเก็บรหัส MSDN แวะไปที่เว็บไซต์ต่อไปนี้ของ Microsoft:
http://code.msdn.microsoft.com/KB932491

หมายเหตุ เก็บรหัส MSDN แสดงภาษาที่มีโปรแกรมแก้ไขด่วนจะพร้อมใช้งาน ถ้าคุณไม่เห็นภาษาของคุณอยู่ในรายการ ได้เนื่องจากหน้ากระดาษที่เก็บรหัสทรัพยากรไม่พร้อมใช้งานสำหรับภาษานั้น

หมายเหตุ ถ้าปัญหาอื่น ๆ เกิดขึ้น หรือถ้าการแก้ไขปัญหาใด ๆ จำเป็น คุณอาจต้องสร้างการร้องขอบริการแยกต่างหาก ค่าใช้จ่ายในการสนับสนุนปกติจะคำถามเพิ่มเติมและปัญหาที่ไม่มีโปรแกรมแก้ไขด่วนนี้เฉพาะ สำหรับรายการทั้งหมด ของหมายเลขโทรศัพท์ของบริการลูกค้าของ Microsoft และการสนับสนุน หรือเมื่อ ต้องสร้างการร้องขอบริการแยกต่างหาก แวะไปที่เว็บไซต์ต่อไปนี้ของ Microsoft:
ชื่อ

ข้อกำหนดเบื้องต้น

ไม่มีสิ่งที่จำเป็นสำหรับการติดตั้งโปรแกรมแก้ไขด่วนนี้

ความต้องการเริ่มการทำงาน

คุณไม่จำเป็นต้องรีสตาร์ทคอมพิวเตอร์หลังจากที่คุณใช้โปรแกรมแก้ไขด่วนนี้

ข้อมูลการแทนที่โปรแกรมแก้ไขด่วน

โปรแกรมแก้ไขด่วนนี้ไม่ได้แทนโปรแกรมแก้ไขด่วนอื่น ๆ

แฟ้มข้อมูล

เวอร์ชันภาษาอังกฤษของ hotfix นี้มีแอตทริบิวต์แฟ้ม (หรือแอตทริบิวต์ของแฟ้มรุ่นที่ใหม่กว่า) ซึ่งแสดงอยู่ในตารางต่อไปนี้ วันและเวลาสำหรับแฟ้มเหล่านี้จะแสดงรายการในรูปแบบเวลา (UTC) เมื่อคุณดูข้อมูลแฟ้มข้อมูล จะถูกแปลงเป็นเวลาท้องถิ่น เมื่อต้องการค้นหาความแตกต่างระหว่างเวลา UTC กับเวลาท้องถิ่น ใช้ โซนเวลา ในการ วันและเวลา รายการใน'แผงควบคุม'
สำหรับ x คอมพิวเตอร์แบบ x86
ยุบตารางนี้ขยายตารางนี้
ชื่อแฟ้มรุ่นของแฟ้มขนาดของแฟ้มวันเวลาแพลตฟอร์ม
Mscordacwks.dll2.0.50727.802802,30403-กุมภาพันธ์-200711:22x 86
Mscorjit.dll2.0.50727.802326,65603-กุมภาพันธ์-200711:22x 86
Mscorlib.dll2.0.50727.8024,308,99203-กุมภาพันธ์-200711:22x 86
Mscorpe.dll2.0.50727.802102,91203-กุมภาพันธ์-200711:22x 86
Mscorwks.dll2.0.50727.8025,625,34403-กุมภาพันธ์-200711:21x 86
Normalization.dll2.0.50727.80215,36003-กุมภาพันธ์-200711:22x 86
Normidna.nlpไม่เกี่ยวข้อง59,34203-กุมภาพันธ์-200711:22ไม่เกี่ยวข้อง
Normnfc.nlpไม่เกี่ยวข้อง45,79403-กุมภาพันธ์-200711:22ไม่เกี่ยวข้อง
Normnfd.nlpไม่เกี่ยวข้อง39,28403-กุมภาพันธ์-200711:22ไม่เกี่ยวข้อง
Normnfkc.nlpไม่เกี่ยวข้อง66,38403-กุมภาพันธ์-200711:22ไม่เกี่ยวข้อง
Normnfkd.nlpไม่เกี่ยวข้อง60,29403-กุมภาพันธ์-200711:22ไม่เกี่ยวข้อง
Peverify.dll2.0.50727.802136,19203-กุมภาพันธ์-200711:21x 86
Sos.dll2.0.50727.802382,46403-กุมภาพันธ์-200711:22x 86
System.data.dll2.0.50727.8022,902,01603-กุมภาพันธ์-200711:22x 86
System.data.oracleclient.dll2.0.50727.802482,30403-กุมภาพันธ์-200711:22x 86
Vsavb7rt.dll8.0.50727.8021,330,68803-กุมภาพันธ์-200711:21x 86
สำหรับคอมพิวเตอร์ที่ใช้ x64
ยุบตารางนี้ขยายตารางนี้
ชื่อแฟ้มรุ่นของแฟ้มขนาดของแฟ้มวันเวลาแพลตฟอร์ม
Mscordacwks.dll2.0.50727.8021,597,44003-กุมภาพันธ์-200703:14x 64
Mscordacwks.dll2.0.50727.802802,30403-กุมภาพันธ์-200711:22x 86
Mscorjit.dll2.0.50727.8021,587,71203-กุมภาพันธ์-200703:13x 64
Mscorjit.dll2.0.50727.802326,65603-กุมภาพันธ์-200711:22x 86
Mscorlib.dll2.0.50727.8023,960,83203-กุมภาพันธ์-200706:28x 64
Mscorlib.dll2.0.50727.8024,308,99203-กุมภาพันธ์-200711:22x 86
Mscorpe.dll2.0.50727.802157,18403-กุมภาพันธ์-200703:07x 64
Mscorpe.dll2.0.50727.802102,91203-กุมภาพันธ์-200711:22x 86
Mscorpjt.dll2.0.50727.8022,004,99203-กุมภาพันธ์-200703:13x 64
Normalization.dll2.0.50727.80218,43203-กุมภาพันธ์-200703:12x 64
Normalization.dll2.0.50727.80215,36003-กุมภาพันธ์-200711:22x 86
Normidna.nlpไม่เกี่ยวข้อง59,34203-กุมภาพันธ์-200703:14ไม่เกี่ยวข้อง
Normidna.nlpไม่เกี่ยวข้อง59,34203-กุมภาพันธ์-200711:22ไม่เกี่ยวข้อง
Normnfc.nlpไม่เกี่ยวข้อง45,79403-กุมภาพันธ์-200703:14ไม่เกี่ยวข้อง
Normnfc.nlpไม่เกี่ยวข้อง45,79403-กุมภาพันธ์-200711:22ไม่เกี่ยวข้อง
Normnfd.nlpไม่เกี่ยวข้อง39,28403-กุมภาพันธ์-200703:14ไม่เกี่ยวข้อง
Normnfd.nlpไม่เกี่ยวข้อง39,28403-กุมภาพันธ์-200711:22ไม่เกี่ยวข้อง
Normnfkc.nlpไม่เกี่ยวข้อง66,38403-กุมภาพันธ์-200703:14ไม่เกี่ยวข้อง
Normnfkc.nlpไม่เกี่ยวข้อง66,38403-กุมภาพันธ์-200711:22ไม่เกี่ยวข้อง
Normnfkd.nlpไม่เกี่ยวข้อง60,29403-กุมภาพันธ์-200703:14ไม่เกี่ยวข้อง
Normnfkd.nlpไม่เกี่ยวข้อง60,29403-กุมภาพันธ์-200711:22ไม่เกี่ยวข้อง
Peverify.dll2.0.50727.802136,19203-กุมภาพันธ์-200711:21x 86
Peverify.nlp2.0.50727.802205,82403-กุมภาพันธ์-200703:13ไม่เกี่ยวข้อง
Sos.dll2.0.50727.802480,76803-กุมภาพันธ์-200703:22x 64
Sos.dll2.0.50727.802382,46403-กุมภาพันธ์-200711:22x 86
System.data.dll2.0.50727.8022,967,04003-กุมภาพันธ์-200706:28x 64
System.data.dll2.0.50727.8022,902,01603-กุมภาพันธ์-200711:22x 86
System.data.oracleclient.dll2.0.50727.802498,68803-กุมภาพันธ์-200706:28x 64
System.data.oracleclient.dll2.0.50727.802482,30403-กุมภาพันธ์-200711:22x 86
Mscorwks.dll2.0.50727.80210,323,45603-กุมภาพันธ์-200703:11x 64
Mscorwks.dll2.0.50727.8025,625,34403-กุมภาพันธ์-200711:21x 86
Vsavb7rt.dll8.0.50727.8021,330,68803-กุมภาพันธ์-200711:21x 86
สำหรับคอมพิวเตอร์ที่ใช้ Itanium
ยุบตารางนี้ขยายตารางนี้
ชื่อแฟ้มรุ่นของแฟ้มขนาดของแฟ้มวันเวลาแพลตฟอร์ม
Mscordacwks.dll2.0.50727.8022,719,23203-กุมภาพันธ์-200703:15IA-64
Mscordacwks.dll2.0.50727.802802,30403-กุมภาพันธ์-200711:22x 86
Mscorjit.dll2.0.50727.8022,705,92003-กุมภาพันธ์-200703:13IA-64
Mscorjit.dll2.0.50727.802326,65603-กุมภาพันธ์-200711:22x 86
Mscorlib.dll2.0.50727.8023,960,83203-กุมภาพันธ์-200706:42IA-64
Mscorlib.dll2.0.50727.8024,308,99203-กุมภาพันธ์-200711:22x 86
Mscorpe.dll2.0.50727.802313,85603-กุมภาพันธ์-200703:06IA-64
Mscorpe.dll2.0.50727.802102,91203-กุมภาพันธ์-200711:22x 86
Mscorpjt.dll2.0.50727.8023,501,05603-กุมภาพันธ์-200703:14IA-64
Normalization.dll2.0.50727.80215,36003-กุมภาพันธ์-200711:22x 86
Normalization.dll2.0.50727.80244,03203-กุมภาพันธ์-200703:12IA-64
Fl_normidna.nlpไม่เกี่ยวข้อง59,34203-กุมภาพันธ์-200711:22ไม่เกี่ยวข้อง
Normidna.nlpไม่เกี่ยวข้อง59,34203-กุมภาพันธ์-200703:14ไม่เกี่ยวข้อง
Normnfc.nlpไม่เกี่ยวข้อง45,79403-กุมภาพันธ์-200711:22ไม่เกี่ยวข้อง
Normnfc.nlpไม่เกี่ยวข้อง45,79403-กุมภาพันธ์-200703:14ไม่เกี่ยวข้อง
Normnfd.nlpไม่เกี่ยวข้อง39,28403-กุมภาพันธ์-200711:22ไม่เกี่ยวข้อง
Normnfd.nlpไม่เกี่ยวข้อง39,28403-กุมภาพันธ์-200703:14ไม่เกี่ยวข้อง
Normnfkc.nlpไม่เกี่ยวข้อง66,38403-กุมภาพันธ์-200711:22ไม่เกี่ยวข้อง
Normnfkc.nlpไม่เกี่ยวข้อง66,38403-กุมภาพันธ์-200703:14ไม่เกี่ยวข้อง
Normnfkd.nlpไม่เกี่ยวข้อง60,29403-กุมภาพันธ์-200711:22ไม่เกี่ยวข้อง
Normnfkd.nlpไม่เกี่ยวข้อง60,29403-กุมภาพันธ์-200703:14ไม่เกี่ยวข้อง
Peverify.dll2.0.50727.802136,19203-กุมภาพันธ์-200711:21x 86
Peverify.dll2.0.50727.802383,48803-กุมภาพันธ์-200703:13IA-64
Sos.dll2.0.50727.802382,46403-กุมภาพันธ์-200711:22x 86
Sos.dll2.0.50727.802862,72003-กุมภาพันธ์-200703:23IA-64
System.data.dll2.0.50727.8022,902,01603-กุมภาพันธ์-200711:22x 86
System.data.dll2.0.50727.8023,109,88803-กุมภาพันธ์-200706:42IA-64
System.data.oracleclient.dll2.0.50727.802482,30403-กุมภาพันธ์-200711:22x 86
System.data.oracleclient.dll2.0.50727.802501,76003-กุมภาพันธ์-200706:42IA-64
Mscorwks.dll2.0.50727.8025,625,34403-กุมภาพันธ์-200711:21x 86
Mscorwks.dll2.0.50727.80221,309,95203-กุมภาพันธ์-200703:11IA-64
Vsavb7rt.dll8.0.50727.8021,330,68803-กุมภาพันธ์-200711:21x 86

สถานะ

Microsoft ยืนยันว่า ปัญหานี้เป็นปัญหาที่เกิดขึ้นกับผลิตภัณฑ์ของ Microsoft ที่ระบุไว้ในส่วน"ใช้งาน"

ข้อมูลเพิ่มเติม

ปัญหาที่ 1: เมื่อมีเรียกวิธี AcceptChanges ในคลา DataView ตัวจัดการระเบียนอาจเสียหาย

ความเสียหายในการจัดการระเบียนอาจเกิดขึ้นในระหว่างการดำเนินการเขียนจากตัวจัดการเหตุการณ์ เมื่อเหตุการณ์นี้เกิดขึ้น มีข้อยกเว้น System.NullreferenceException อาจถูกยกกำลัง นอกจากนี้ เมื่อแอพลิเคชันทำการดำเนินการเขียนในเหตุการณ์การListChangedการปรับปรุงดัชนีอาจเกิดขึ้นในลำดับไม่ถูกต้อง

ตัวอย่างเช่น พิจารณาสถานการณ์สมมติต่อไปนี้:
  1. คุณสามารถใช้รหัสดังต่อไปนี้ในแอพลิเคชัน:
    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: มีการคำนวณค่าในคอลัมน์ที่มีนิพจน์อาจไม่สามารถปรับปรุงได้อย่างถูกต้อง

เมื่อคุณพยายามที่คำนวณค่าของคอลัมน์ที่มีนิพจน์ในชุดข้อมูลวัตถุ และคอลัมน์นิพจน์เป็นส่วนหนึ่งของความสัมพันธ์ มีการคำนวณค่าของคอลัมน์นิพจน์อาจไม่สามารถปรับปรุงได้อย่างถูกต้อง ตัวอย่างเช่น พิจารณาสถานการณ์สมมติต่อไปนี้:
  1. คุณสามารถใช้รหัสดังต่อไปนี้ในแอพลิเคชัน:
    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ร่วมกับส่วนคำสั่งที่เรียกข้อมูลสำหรับหลายงบ วิธีการเลือกอาจส่งคืนผลลัพธ์ที่ไม่ถูกต้อง ตัวอย่างเช่น รหัสต่อไปนี้ส่งกลับผลลัพธ์ไม่ถูกต้อง:
string filter = "(NOT ColTwo = 1) AND (ColOne = 2)";
DataTable.Select(filter);
อย่างไรก็ตาม รหัสต่อไปนี้ส่งกลับผลลัพธ์ที่ถูกต้อง:
string filter = "NOT ColTwo = 1 AND ColOne = 2";
DataTable.Select(filter);
นอกจากนี้ พิจารณาสถานการณ์สมมติต่อไปนี้:
  1. คุณสามารถใช้รหัสดังต่อไปนี้ในแอพลิเคชัน:
    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. คุณเรียกใช้แอพลิเคชัน
ในสถานการณ์สมมตินี้ คุณได้รับผลลัพธ์ต่อไปนี้:
query="(NOT ColTwo = 1) AND (ColOne = 2)" count=2
        3, 2, 1
        4, 2, 2
query="(ColOne = 2) AND (NOT ColTwo = 1)" count=1
        4, 2, 2
query="NOT ColTwo = 1 AND ColOne = 2" count=1
        4, 2, 2
query="ColOne = 2 AND NOT ColTwo = 1" count=1
        4, 2, 2
query="NOT ColTwo = 1 AND (ColOne = 2)" count=2
        3, 2, 1
        4, 2, 2
query="(ColOne = 2) AND NOT ColTwo = 1" count=1
        4, 2, 2
query="(NOT ColTwo = 1) AND ColOne = 2" count=1
        4, 2, 2
query="ColOne = 2 AND (NOT ColTwo = 1)" count=1
        4, 2, 2
ในการแสดงผลนี้ "(ColOne = 2) " จะแสดงอยู่ทางด้านขวาของส่วนคำสั่งไม่ถูกต้อง

ปัญหาที่ 4: ดัชนีภายในของ DataTable อาจเสียหาย และคุณได้รับข้อความแสดงข้อความข้อผิดพลาด '13'

เมื่อคุณพยายามที่ใช้เมธอดของวัตถุชุดข้อมูลที่ถูกใช้ โดยวัตถุDataTableAcceptChangesและคุณได้ตั้งค่ากฎ ForeignKey เป็นAcceptRule.Cascadeค่าดัชนีภายในที่ใช้ โดยวัตถุชุดข้อมูลอาจเสียหายไป ปัญหานี้เกิดขึ้นหากมีเงื่อนไขต่อไปนี้:
  • วัตถุชุดข้อมูลประกอบด้วยตารางอย่าง น้อยหนึ่งตารางที่มีความสัมพันธ์แบบหนึ่งต่อ-กลุ่ม
  • AcceptChangesเมธอดของวัตถุชุดข้อมูลนั้น
  • ตั้งค่าAcceptRejectRuleของวัตถุชุดข้อมูลเมื่อต้องการเรียงซ้อน เมื่อมีตั้งค่านี้เป็นการเรียงซ้อน ตารางลูกจะเปลี่ยนแปลงเพื่อให้ได้โดยอัตโนมัติอย่างใดอย่างหนึ่งข้อมูลยอมรับ หรือไม่ยอมรับข้อมูล
ตัวอย่างเช่น พิจารณาสถานการณ์สมมติต่อไปนี้:
  1. คุณสามารถใช้รหัสดังต่อไปนี้ในแอพลิเคชัน:
    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ผู้จัดการระเบียนสำหรับวัตถุชุดข้อมูลของวัตถุDataTableอาจเสียหายไป

หมายเหตุ เมื่อกำลังถูกแก้ไขแถวในวัตถุDataTable , DataRowVersionค่าของแถวถูกตั้งค่าการ Proposed

ตัวอย่างเช่น พิจารณาสถานการณ์สมมติต่อไปนี้:
  1. คุณสามารถใช้รหัสดังต่อไปนี้ในแอพลิเคชัน:
    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. คุณเรียกใช้แอพลิเคชัน
ในสถานการณ์สมมตินี้ ตัวจัดการระเบียนสำหรับวัตถุชุดข้อมูลDataTableวัตถุที่เสียหาย

เมื่อต้องหลีกเลี่ยงปัญหานี้ ตรวจสอบให้แน่ใจว่า มีแถวในชุดข้อมูลวัตถุปลายทางที่มีการตั้งค่าค่าDataRowVersionเป็น Proposed ก่อนที่คุณใช้เมธอดDataTable.MergeหรือวิธีการDataSet.Merge

ปัญหาที่ 6: ดัชนีภายในของ DataTable วัตถุอาจเสียหาย และคุณได้รับข้อความแสดงข้อความข้อผิดพลาด '5'

สถานการณ์สมมติต่อไปนี้ในการทำให้เกิดความเสียหายในDataTableวัตถุ โดยการเปลี่ยนแปลงข้อมูลในDataTableวัตถุไม่มีการปรับปรุงดัชนีภายในของDataTableวัตถุ:
  1. ค่าDataColumn.Expressionถูกเปลี่ยนจากนิพจน์จะไม่มีนิพจน์ ในสถานการณ์สมมตินี้ ข้อมูลทั้งหมดในDataColumnวัตถุถูกตั้งค่าเป็น DBNull
  2. เมื่อมีเรียกวิธีDataTable.Clearข้อมูลทั้งหมดในDataTableวัตถุจะถูกเอาออก และดัชนีจะถูกปรับปรุง อย่างไรก็ตาม ตารางอื่น ๆ ที่อ้างอิงวัตถุDataTableจะไม่ปรับปรุง
ตัวอย่างเช่น พิจารณาสถานการณ์สมมติต่อไปนี้:
  1. คุณสามารถใช้รหัสดังต่อไปนี้ในแอพลิเคชัน:
    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

คุณสมบัติ

หมายเลขบทความ (Article ID): 932491 - รีวิวครั้งสุดท้าย: 21 สิงหาคม 2555 - Revision: 3.0
ใช้กับ
  • Microsoft .NET Framework 2.0
Keywords: 
kbfix kbbug kbprb kbexpertiseinter kbexpertisebeginner kbqfe kbmt KB932491 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:932491

ให้ข้อเสนอแนะ

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com