การแก้ไข: ข้อมูลที่เกี่ยวข้องกับคอมโพเนนต์ที่ใช้วัตถุ 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:
หมายเหตุ เก็บรหัส MSDN แสดงภาษาที่มีโปรแกรมแก้ไขด่วนจะพร้อมใช้งาน ถ้าคุณไม่เห็นภาษาของคุณอยู่ในรายการ ได้เนื่องจากหน้ากระดาษที่เก็บรหัสทรัพยากรไม่พร้อมใช้งานสำหรับภาษานั้น
หมายเหตุ ถ้าปัญหาอื่น ๆ เกิดขึ้น หรือถ้าการแก้ไขปัญหาใด ๆ จำเป็น คุณอาจต้องสร้างการร้องขอบริการแยกต่างหาก ค่าใช้จ่ายในการสนับสนุนปกติจะคำถามเพิ่มเติมและปัญหาที่ไม่มีโปรแกรมแก้ไขด่วนนี้เฉพาะ สำหรับรายการทั้งหมด ของหมายเลขโทรศัพท์ของบริการลูกค้าของ Microsoft และการสนับสนุน หรือเมื่อ ต้องสร้างการร้องขอบริการแยกต่างหาก แวะไปที่เว็บไซต์ต่อไปนี้ของ Microsoft:
ชื่อ
(http://support.microsoft.com/contactus/?ws=support)
ข้อกำหนดเบื้องต้น ไม่มีสิ่งที่จำเป็นสำหรับการติดตั้งโปรแกรมแก้ไขด่วนนี้
ความต้องการเริ่มการทำงาน คุณไม่จำเป็นต้องรีสตาร์ทคอมพิวเตอร์หลังจากที่คุณใช้โปรแกรมแก้ไขด่วนนี้
ข้อมูลการแทนที่โปรแกรมแก้ไขด่วน โปรแกรมแก้ไขด่วนนี้ไม่ได้แทนโปรแกรมแก้ไขด่วนอื่น ๆ
แฟ้มข้อมูล เวอร์ชันภาษาอังกฤษของ hotfix นี้มีแอตทริบิวต์แฟ้ม (หรือแอตทริบิวต์ของแฟ้มรุ่นที่ใหม่กว่า) ซึ่งแสดงอยู่ในตารางต่อไปนี้ วันและเวลาสำหรับแฟ้มเหล่านี้จะแสดงรายการในรูปแบบเวลา (UTC) เมื่อคุณดูข้อมูลแฟ้มข้อมูล จะถูกแปลงเป็นเวลาท้องถิ่น เมื่อต้องการค้นหาความแตกต่างระหว่างเวลา UTC กับเวลาท้องถิ่น ใช้
โซนเวลา ในการ
วันและเวลา รายการใน'แผงควบคุม'
สำหรับ x คอมพิวเตอร์แบบ x86 ยุบตารางนี้ ขยายตารางนี้
ชื่อแฟ้ม รุ่นของแฟ้ม ขนาดของแฟ้ม วัน เวลา แพลตฟอร์ม Mscordacwks.dll 2.0.50727.802 802,304 03-กุมภาพันธ์-2007 11:22 x 86 Mscorjit.dll 2.0.50727.802 326,656 03-กุมภาพันธ์-2007 11:22 x 86 Mscorlib.dll 2.0.50727.802 4,308,992 03-กุมภาพันธ์-2007 11:22 x 86 Mscorpe.dll 2.0.50727.802 102,912 03-กุมภาพันธ์-2007 11:22 x 86 Mscorwks.dll 2.0.50727.802 5,625,344 03-กุมภาพันธ์-2007 11:21 x 86 Normalization.dll 2.0.50727.802 15,360 03-กุมภาพันธ์-2007 11:22 x 86 Normidna.nlp ไม่เกี่ยวข้อง 59,342 03-กุมภาพันธ์-2007 11:22 ไม่เกี่ยวข้อง Normnfc.nlp ไม่เกี่ยวข้อง 45,794 03-กุมภาพันธ์-2007 11:22 ไม่เกี่ยวข้อง Normnfd.nlp ไม่เกี่ยวข้อง 39,284 03-กุมภาพันธ์-2007 11:22 ไม่เกี่ยวข้อง Normnfkc.nlp ไม่เกี่ยวข้อง 66,384 03-กุมภาพันธ์-2007 11:22 ไม่เกี่ยวข้อง Normnfkd.nlp ไม่เกี่ยวข้อง 60,294 03-กุมภาพันธ์-2007 11:22 ไม่เกี่ยวข้อง Peverify.dll 2.0.50727.802 136,192 03-กุมภาพันธ์-2007 11:21 x 86 Sos.dll 2.0.50727.802 382,464 03-กุมภาพันธ์-2007 11:22 x 86 System.data.dll 2.0.50727.802 2,902,016 03-กุมภาพันธ์-2007 11:22 x 86 System.data.oracleclient.dll 2.0.50727.802 482,304 03-กุมภาพันธ์-2007 11:22 x 86 Vsavb7rt.dll 8.0.50727.802 1,330,688 03-กุมภาพันธ์-2007 11:21 x 86
สำหรับคอมพิวเตอร์ที่ใช้ x64 ยุบตารางนี้ ขยายตารางนี้
ชื่อแฟ้ม รุ่นของแฟ้ม ขนาดของแฟ้ม วัน เวลา แพลตฟอร์ม Mscordacwks.dll 2.0.50727.802 1,597,440 03-กุมภาพันธ์-2007 03:14 x 64 Mscordacwks.dll 2.0.50727.802 802,304 03-กุมภาพันธ์-2007 11:22 x 86 Mscorjit.dll 2.0.50727.802 1,587,712 03-กุมภาพันธ์-2007 03:13 x 64 Mscorjit.dll 2.0.50727.802 326,656 03-กุมภาพันธ์-2007 11:22 x 86 Mscorlib.dll 2.0.50727.802 3,960,832 03-กุมภาพันธ์-2007 06:28 x 64 Mscorlib.dll 2.0.50727.802 4,308,992 03-กุมภาพันธ์-2007 11:22 x 86 Mscorpe.dll 2.0.50727.802 157,184 03-กุมภาพันธ์-2007 03:07 x 64 Mscorpe.dll 2.0.50727.802 102,912 03-กุมภาพันธ์-2007 11:22 x 86 Mscorpjt.dll 2.0.50727.802 2,004,992 03-กุมภาพันธ์-2007 03:13 x 64 Normalization.dll 2.0.50727.802 18,432 03-กุมภาพันธ์-2007 03:12 x 64 Normalization.dll 2.0.50727.802 15,360 03-กุมภาพันธ์-2007 11:22 x 86 Normidna.nlp ไม่เกี่ยวข้อง 59,342 03-กุมภาพันธ์-2007 03:14 ไม่เกี่ยวข้อง Normidna.nlp ไม่เกี่ยวข้อง 59,342 03-กุมภาพันธ์-2007 11:22 ไม่เกี่ยวข้อง Normnfc.nlp ไม่เกี่ยวข้อง 45,794 03-กุมภาพันธ์-2007 03:14 ไม่เกี่ยวข้อง Normnfc.nlp ไม่เกี่ยวข้อง 45,794 03-กุมภาพันธ์-2007 11:22 ไม่เกี่ยวข้อง Normnfd.nlp ไม่เกี่ยวข้อง 39,284 03-กุมภาพันธ์-2007 03:14 ไม่เกี่ยวข้อง Normnfd.nlp ไม่เกี่ยวข้อง 39,284 03-กุมภาพันธ์-2007 11:22 ไม่เกี่ยวข้อง Normnfkc.nlp ไม่เกี่ยวข้อง 66,384 03-กุมภาพันธ์-2007 03:14 ไม่เกี่ยวข้อง Normnfkc.nlp ไม่เกี่ยวข้อง 66,384 03-กุมภาพันธ์-2007 11:22 ไม่เกี่ยวข้อง Normnfkd.nlp ไม่เกี่ยวข้อง 60,294 03-กุมภาพันธ์-2007 03:14 ไม่เกี่ยวข้อง Normnfkd.nlp ไม่เกี่ยวข้อง 60,294 03-กุมภาพันธ์-2007 11:22 ไม่เกี่ยวข้อง Peverify.dll 2.0.50727.802 136,192 03-กุมภาพันธ์-2007 11:21 x 86 Peverify.nlp 2.0.50727.802 205,824 03-กุมภาพันธ์-2007 03:13 ไม่เกี่ยวข้อง Sos.dll 2.0.50727.802 480,768 03-กุมภาพันธ์-2007 03:22 x 64 Sos.dll 2.0.50727.802 382,464 03-กุมภาพันธ์-2007 11:22 x 86 System.data.dll 2.0.50727.802 2,967,040 03-กุมภาพันธ์-2007 06:28 x 64 System.data.dll 2.0.50727.802 2,902,016 03-กุมภาพันธ์-2007 11:22 x 86 System.data.oracleclient.dll 2.0.50727.802 498,688 03-กุมภาพันธ์-2007 06:28 x 64 System.data.oracleclient.dll 2.0.50727.802 482,304 03-กุมภาพันธ์-2007 11:22 x 86 Mscorwks.dll 2.0.50727.802 10,323,456 03-กุมภาพันธ์-2007 03:11 x 64 Mscorwks.dll 2.0.50727.802 5,625,344 03-กุมภาพันธ์-2007 11:21 x 86 Vsavb7rt.dll 8.0.50727.802 1,330,688 03-กุมภาพันธ์-2007 11:21 x 86
สำหรับคอมพิวเตอร์ที่ใช้ Itanium ยุบตารางนี้ ขยายตารางนี้
ชื่อแฟ้ม รุ่นของแฟ้ม ขนาดของแฟ้ม วัน เวลา แพลตฟอร์ม Mscordacwks.dll 2.0.50727.802 2,719,232 03-กุมภาพันธ์-2007 03:15 IA-64 Mscordacwks.dll 2.0.50727.802 802,304 03-กุมภาพันธ์-2007 11:22 x 86 Mscorjit.dll 2.0.50727.802 2,705,920 03-กุมภาพันธ์-2007 03:13 IA-64 Mscorjit.dll 2.0.50727.802 326,656 03-กุมภาพันธ์-2007 11:22 x 86 Mscorlib.dll 2.0.50727.802 3,960,832 03-กุมภาพันธ์-2007 06:42 IA-64 Mscorlib.dll 2.0.50727.802 4,308,992 03-กุมภาพันธ์-2007 11:22 x 86 Mscorpe.dll 2.0.50727.802 313,856 03-กุมภาพันธ์-2007 03:06 IA-64 Mscorpe.dll 2.0.50727.802 102,912 03-กุมภาพันธ์-2007 11:22 x 86 Mscorpjt.dll 2.0.50727.802 3,501,056 03-กุมภาพันธ์-2007 03:14 IA-64 Normalization.dll 2.0.50727.802 15,360 03-กุมภาพันธ์-2007 11:22 x 86 Normalization.dll 2.0.50727.802 44,032 03-กุมภาพันธ์-2007 03:12 IA-64 Fl_normidna.nlp ไม่เกี่ยวข้อง 59,342 03-กุมภาพันธ์-2007 11:22 ไม่เกี่ยวข้อง Normidna.nlp ไม่เกี่ยวข้อง 59,342 03-กุมภาพันธ์-2007 03:14 ไม่เกี่ยวข้อง Normnfc.nlp ไม่เกี่ยวข้อง 45,794 03-กุมภาพันธ์-2007 11:22 ไม่เกี่ยวข้อง Normnfc.nlp ไม่เกี่ยวข้อง 45,794 03-กุมภาพันธ์-2007 03:14 ไม่เกี่ยวข้อง Normnfd.nlp ไม่เกี่ยวข้อง 39,284 03-กุมภาพันธ์-2007 11:22 ไม่เกี่ยวข้อง Normnfd.nlp ไม่เกี่ยวข้อง 39,284 03-กุมภาพันธ์-2007 03:14 ไม่เกี่ยวข้อง Normnfkc.nlp ไม่เกี่ยวข้อง 66,384 03-กุมภาพันธ์-2007 11:22 ไม่เกี่ยวข้อง Normnfkc.nlp ไม่เกี่ยวข้อง 66,384 03-กุมภาพันธ์-2007 03:14 ไม่เกี่ยวข้อง Normnfkd.nlp ไม่เกี่ยวข้อง 60,294 03-กุมภาพันธ์-2007 11:22 ไม่เกี่ยวข้อง Normnfkd.nlp ไม่เกี่ยวข้อง 60,294 03-กุมภาพันธ์-2007 03:14 ไม่เกี่ยวข้อง Peverify.dll 2.0.50727.802 136,192 03-กุมภาพันธ์-2007 11:21 x 86 Peverify.dll 2.0.50727.802 383,488 03-กุมภาพันธ์-2007 03:13 IA-64 Sos.dll 2.0.50727.802 382,464 03-กุมภาพันธ์-2007 11:22 x 86 Sos.dll 2.0.50727.802 862,720 03-กุมภาพันธ์-2007 03:23 IA-64 System.data.dll 2.0.50727.802 2,902,016 03-กุมภาพันธ์-2007 11:22 x 86 System.data.dll 2.0.50727.802 3,109,888 03-กุมภาพันธ์-2007 06:42 IA-64 System.data.oracleclient.dll 2.0.50727.802 482,304 03-กุมภาพันธ์-2007 11:22 x 86 System.data.oracleclient.dll 2.0.50727.802 501,760 03-กุมภาพันธ์-2007 06:42 IA-64 Mscorwks.dll 2.0.50727.802 5,625,344 03-กุมภาพันธ์-2007 11:21 x 86 Mscorwks.dll 2.0.50727.802 21,309,952 03-กุมภาพันธ์-2007 03:11 IA-64 Vsavb7rt.dll 8.0.50727.802 1,330,688 03-กุมภาพันธ์-2007 11:21 x 86
Microsoft ยืนยันว่า ปัญหานี้เป็นปัญหาที่เกิดขึ้นกับผลิตภัณฑ์ของ Microsoft ที่ระบุไว้ในส่วน"ใช้งาน"
ปัญหาที่ 1: เมื่อมีเรียกวิธี AcceptChanges ในคลา DataView ตัวจัดการระเบียนอาจเสียหาย ความเสียหายในการจัดการระเบียนอาจเกิดขึ้นในระหว่างการดำเนินการเขียนจากตัวจัดการเหตุการณ์ เมื่อเหตุการณ์นี้เกิดขึ้น มีข้อยกเว้น System.NullreferenceException อาจถูกยกกำลัง นอกจากนี้ เมื่อแอพลิเคชันทำการดำเนินการเขียนในเหตุการณ์การ
ListChanged การปรับปรุงดัชนีอาจเกิดขึ้นในลำดับไม่ถูกต้อง
ตัวอย่างเช่น พิจารณาสถานการณ์สมมติต่อไปนี้:
คุณสามารถใช้รหัสดังต่อไปนี้ในแอพลิเคชัน: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();
}
}
} คุณเรียกใช้แอพลิเคชัน ในสถานการณ์สมมตินี้ คุณได้รับข้อความแสดงข้อผิดพลาดที่คล้ายกับข้อความแสดงข้อผิดพลาดต่อไปนี้:
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: มีการคำนวณค่าในคอลัมน์ที่มีนิพจน์อาจไม่สามารถปรับปรุงได้อย่างถูกต้อง เมื่อคุณพยายามที่คำนวณค่าของคอลัมน์ที่มีนิพจน์ใน
ชุดข้อมูล วัตถุ และคอลัมน์นิพจน์เป็นส่วนหนึ่งของความสัมพันธ์ มีการคำนวณค่าของคอลัมน์นิพจน์อาจไม่สามารถปรับปรุงได้อย่างถูกต้อง ตัวอย่างเช่น พิจารณาสถานการณ์สมมติต่อไปนี้:
คุณสามารถใช้รหัสดังต่อไปนี้ในแอพลิเคชัน: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);
}
} คุณเรียกใช้แอพลิเคชัน ในสถานการณ์สมมตินี้ คุณได้รับผลลัพธ์ต่อไปนี้:
<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);
นอกจากนี้ พิจารณาสถานการณ์สมมติต่อไปนี้:
คุณสามารถใช้รหัสดังต่อไปนี้ในแอพลิเคชัน: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]);
}
}
}
คุณเรียกใช้แอพลิเคชัน ในสถานการณ์สมมตินี้ คุณได้รับผลลัพธ์ต่อไปนี้:
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' เมื่อคุณพยายามที่ใช้เมธอดของวัตถุ
ชุดข้อมูล ที่ถูกใช้ โดยวัตถุ
DataTable AcceptChanges และคุณได้ตั้งค่ากฎ ForeignKey เป็น
AcceptRule.Cascade ค่าดัชนีภายในที่ใช้ โดยวัตถุ
ชุดข้อมูล อาจเสียหายไป ปัญหานี้เกิดขึ้นหากมีเงื่อนไขต่อไปนี้:
วัตถุชุดข้อมูล ประกอบด้วยตารางอย่าง น้อยหนึ่งตารางที่มีความสัมพันธ์แบบหนึ่งต่อ-กลุ่ม AcceptChanges เมธอดของวัตถุชุดข้อมูล นั้นตั้งค่าAcceptRejectRule ของวัตถุชุดข้อมูล เมื่อต้องการเรียงซ้อน เมื่อมีตั้งค่านี้เป็นการเรียงซ้อน ตารางลูกจะเปลี่ยนแปลงเพื่อให้ได้โดยอัตโนมัติอย่างใดอย่างหนึ่งข้อมูลยอมรับ หรือไม่ยอมรับข้อมูล ตัวอย่างเช่น พิจารณาสถานการณ์สมมติต่อไปนี้:
คุณสามารถใช้รหัสดังต่อไปนี้ในแอพลิเคชัน: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();
} คุณเรียกใช้แอพลิเคชัน ในสถานการณ์สมมตินี้ คุณได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:
ดัชนีภายในของ DataTable เกิดความเสียหาย: '13'
ปัญหาที่ 5: เมื่อการดำเนินการผสานเกิดขึ้น ตัวจัดการระเบียนอาจเสียถ้าแถวเป้าหมายอยู่ในสถานะแก้ไข ถ้ากำลัง แก้ไข หนึ่งแถว หรือมากกว่าใน
DataTable วัตถุแล้วการดำเนินการ
DataTable.Merge ที่เกิดขึ้น หรือเกิดขึ้นกับการดำเนินการ
DataSet.Merge ผู้จัดการระเบียนสำหรับวัตถุ
ชุดข้อมูล ของวัตถุ
DataTable อาจเสียหายไป
หมายเหตุ เมื่อกำลังถูกแก้ไขแถวในวัตถุ
DataTable ,
DataRowVersion ค่าของแถวถูกตั้งค่าการ Proposed
ตัวอย่างเช่น พิจารณาสถานการณ์สมมติต่อไปนี้:
คุณสามารถใช้รหัสดังต่อไปนี้ในแอพลิเคชัน: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]);
}
}
}
}
} คุณเรียกใช้แอพลิเคชัน ในสถานการณ์สมมตินี้ ตัวจัดการระเบียนสำหรับวัตถุ
ชุดข้อมูล DataTable วัตถุที่เสียหาย
เมื่อต้องหลีกเลี่ยงปัญหานี้ ตรวจสอบให้แน่ใจว่า มีแถวใน
ชุดข้อมูล วัตถุปลายทางที่มีการตั้งค่าค่า
DataRowVersion เป็น Proposed ก่อนที่คุณใช้เมธอด
DataTable.Merge หรือวิธีการ
DataSet.Merge ปัญหาที่ 6: ดัชนีภายในของ DataTable วัตถุอาจเสียหาย และคุณได้รับข้อความแสดงข้อความข้อผิดพลาด '5' สถานการณ์สมมติต่อไปนี้ในการทำให้เกิดความเสียหายใน
DataTable วัตถุ โดยการเปลี่ยนแปลงข้อมูลใน
DataTable วัตถุไม่มีการปรับปรุงดัชนีภายในของ
DataTable วัตถุ:
ค่าDataColumn.Expression ถูกเปลี่ยนจากนิพจน์จะไม่มีนิพจน์ ในสถานการณ์สมมตินี้ ข้อมูลทั้งหมดในDataColumn วัตถุถูกตั้งค่าเป็น DBNull เมื่อมีเรียกวิธีDataTable.Clear ข้อมูลทั้งหมดในDataTable วัตถุจะถูกเอาออก และดัชนีจะถูกปรับปรุง อย่างไรก็ตาม ตารางอื่น ๆ ที่อ้างอิงวัตถุDataTable จะไม่ปรับปรุง ตัวอย่างเช่น พิจารณาสถานการณ์สมมติต่อไปนี้:
คุณสามารถใช้รหัสดังต่อไปนี้ในแอพลิเคชัน: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;
}
}
}
}
}
คุณเรียกใช้แอพลิเคชัน ในสถานการณ์สมมตินี้ คุณได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:
ดัชนีภายในของ DataTable เกิดความเสียหาย: '5'
สำหรับข้อมูลเพิ่มเติม คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:
824684
(http://support.microsoft.com/kb/824684/
)
คำอธิบายของคำศัพท์มาตรฐานที่ใช้เพื่ออธิบายปรับปรุงซอฟต์แวร์ของ Microsoft
หมายเลขบทความ (Article ID): 932491 - รีวิวครั้งสุดท้าย: 21 สิงหาคม 2555 - Revision: 3.0
ใช้กับ Microsoft .NET Framework 2.0 kbfix kbbug kbprb kbexpertiseinter kbexpertisebeginner kbqfe kbmt KB932491 KbMtth
แปลโดยคอมพิวเตอร์ ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:
932491
(http://support.microsoft.com/kb/932491/en-us/
)
ขอบคุณมาก เราจะใช้คำติชมของคุณเพื่อปรับปรุงเนื้อหาการสนับสนุนของเรา สำหรับทางเลือกอื่นๆ ในการให้ความช่วยเหลือ โปรดแวะชม
วิธีใช้และโฮมเพจการสนับสนุน