วัตถุ CommandBuilder อาจสร้างคำสั่งที่คุณพยายามปรับเปลี่ยนในระหว่างการเรียกวิธี DataAdapter.Update ถัดไป และเปลี่ยนแปลงของคุณไปยังคำสั่งอาจสูญหาย

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

ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:310366
บทความนี้ถูกเก็บถาวรแล้วเนื้อหาของบทความจึงถูกนำเสนอ "ตามลักษณะที่เป็น" และจะไม่มีการปรับปรุงข้อมูลอีก
บทความนี้อ้างถึง namespace ไลบรารีคลาสของ Microsoft .NET Framework ต่อไปนี้:
  • System.Data.SqlClient
อาการ
กระบวนการCommandBuilderวัตถุอาจสร้างคำสั่งที่คุณพยายามปรับเปลี่ยนในระหว่างการเรียกถัดไปDataAdapter.Updateเมธอด และเปลี่ยนแปลงของคุณไปยังคำสั่งอาจสูญหาย ปัญหานี้เกิดขึ้นในสถานการณ์ต่อไปนี้:
  • ถ้าคุณเชื่อมโยงกับCommandBuilderวัตถุด้วยการDataAdapterวัตถุ
  • ถ้าคุณใช้การGetInsertCommand,GetUpdateCommandหรือGetDeleteCommandวิธีการนี้CommandBuilderวัตถุที่ได้กำหนดคำสั่งไปDataAdapter.
  • ถ้าคุณปรับเปลี่ยนคำสั่งอย่างใดอย่างหนึ่งที่CommandBuilderสร้าง
เมื่อคุณพยายามเรียกการการปรับปรุงวิธีการนี้DataAdapterคุณอาจได้รับข้อความแจ้งความผิดพลาดต่อไปนี้::
ข้อยกเว้น unhandled ชนิด 'System.Data.SqlClient.SqlException' ที่เกิดขึ้นใน system.data.dll
สาเหตุ
ปัญหานี้เกิดขึ้นเนื่องจากCommandBuilderแบบไดนามิก alters คำสั่งที่สร้างกลับไปยังคำสั่งดั้งเดิม
การแก้ไข
ใช้วิธีการต่อไปนี้อย่างใดอย่างหนึ่งเพื่อแก้ไขปัญหานี้:
  • ไม่ปรับเปลี่ยนคำสั่งที่CommandBuilderสร้างCommandBuilderไม่เปลี่ยนแปลงคำสั่งวัตถุที่คุณสร้างด้วยตนเอง
  • สำเนาInsertCommand,DeleteCommandและUpdateCommandวัตถุกับข้อความใหม่DataAdapter(โปรดดูส่วน "ข้อมูลเพิ่มเติม" สำหรับตัวอย่าง) ใหม่DataAdapterตัวแปรต้องมีขอบเขตที่เหมือนกัน หรือ narrower ตามเดิมDataAdapterตัวแปร
  • ไม่ได้ใช้CommandBuilderทั้งหมด เขียนของคุณเองคำสั่งวัตถุ หรือใช้เครื่องมือข้อมูลแสดงผลที่จะเขียนแฟ้มเหล่านั้น
สถานะ
ลักษณะการทำงานนี้เกิดจากการออกแบบ
ข้อมูลเพิ่มเติม

ขั้นตอนในการทำให้สถานการณ์เกิดขึ้นอีกครั้ง

  1. สร้างโครงการใหม่ของแอพลิเคชัน Windows Visual Basic form1 ถูกเพิ่มเข้าไปในโครงการที่เป็นค่าเริ่มต้น
  2. คลิกสองครั้งที่รูปแบบ และเพิ่มรหัสต่อไปนี้ที่ด้านบนของหน้าต่างรหัส:
    Imports System.Data.SqlClient					
  3. เพิ่มคำปุ่มควบคุมการ Form1
  4. คลิกสองครั้งปุ่ม และเพิ่มโค้ดต่อไปนี้ไปคลิกเหตุการณ์:
    Dim cn As New SqlConnection()        Dim custDS As New DataSet()        Dim da1 As New SqlDataAdapter()        Dim da2 As New SqlDataAdapter()        Dim dr As DataRow        Dim cb As SqlCommandBuilder        cn.ConnectionString = "server=servername;database=northwind;uid=sa;pwd=password;"        cn.Open()        da1 = New SqlDataAdapter("select * from Customers", cn)        cb = New SqlCommandBuilder(da1)        da1.Fill(custDS, "Customers")        'Get the original commands.        da1.InsertCommand = cb.GetInsertCommand        da1.DeleteCommand = cb.GetDeleteCommand        da1.UpdateCommand = cb.GetUpdateCommand        Debug.WriteLine("Original command length: " & da1.InsertCommand.CommandText.Length)        'Modify the Insert command.        da1.InsertCommand.CommandText = "select * from customers where customerid=@@identity"        da1.InsertCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord        da2.InsertCommand = da1.InsertCommand        da2.DeleteCommand = da1.DeleteCommand        da2.UpdateCommand = da1.UpdateCommand        'Add a record to the table.        Dim tblCust As DataTable        tblCust = custDS.Tables("Customers")        Dim drCust As DataRow        drCust = tblCust.NewRow()        drCust("CustomerID") = "ZYYYY"        drCust("CompanyName") = "Zora's Yummies"        drCust("ContactName") = "Christophe Namby"        drCust("ContactTitle") = "Assistant Manager"        tblCust.Rows.Add(drCust)        'Update the backend.        Debug.WriteLine("Length da1 before insert: " & da1.InsertCommand.CommandText.Length)        da1.Update(custDS, "Customers")        Debug.WriteLine("Length da1 after insert: " & da1.InsertCommand.CommandText.Length)        Debug.WriteLine("length da2 before insert: " & da2.InsertCommand.CommandText.Length)        da2.Update(custDS, "Customers")        Debug.WriteLine("Length da2 after insert: " & da2.InsertCommand.CommandText.Length)					
  5. แก้ไขสายอักขระการเชื่อมต่อการเชื่อมต่อกับคอมพิวเตอร์ของคุณ Microsoft SQL Server
  6. กดแป้น F5 เพื่อเรียกใช้รหัส
  7. ข้อคิดเห็นออกบรรทัดต่อไปนี้เพื่อแก้ไขปัญหานี้:
            da1.Update(custDS, "Customers")					
การแก้ปัญหานี้ได้เนื่องจากการทำงานCommandBuilderhooksRowUpdatingเหตุการณ์บนการDataAdapter("da1") ดังนั้นจึงทราบเวลาที่จะสร้างคำสั่ง เมื่อคุณคัดลอกคำสั่งไปที่แตกต่างกันDataAdapter("da2"),CommandBuilderไม่ hooked ลงในเหตุการณ์นั้น และไม่เปลี่ยนดังกล่าว

ขอบเขตที่ตัวแปรที่จำเป็นเพราะว่า "da1" และSqlCommandBuilder("cb") go ออกจากขอบเขต และ ถ้าเกิด ขึ้นในคอลเลกชันเบจCommandBuilderตั้งค่าของคำสั่งไม่มีสิ่งใด(ว่างใน Visual c#) ซึ่ง คุณไม่สามารถใช้คำสั่งเหล่านี้ได้ใน "da2" เนื่องจากคอลเลกชันเบจอาจเกิดขึ้นในสุ่ม เวลาda2.Updateการเรียกเมธอดอาจยกข้อผิดพลาด NullReferenceException เป็นระยะ ๆ
ไม่มีบันทึกผล take

คำเตือน: บทความนี้ได้รับการแปลโดยอัตโนมัติ

คุณสมบัติ

รหัสบทความ: 310366 - การตรวจสอบครั้งสุดท้าย: 02/24/2014 12:52:36 - ฉบับแก้ไข: 2.0

Microsoft ADO.NET 2.0, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual Basic 2005

  • kbnosurvey kbarchive kbtshoot kberrmsg kbprb kbsqlclient kbsystemdata kbmt KB310366 KbMtth
คำติชม