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

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 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 เป็นระยะ ๆ

คุณสมบัติ

หมายเลขบทความ (Article ID): 310366 - รีวิวครั้งสุดท้าย: 24 กุมภาพันธ์ 2557 - Revision: 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
Keywords: 
kbnosurvey kbarchive kbtshoot kberrmsg kbprb kbsqlclient kbsystemdata kbmt KB310366 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:310366

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