กระบวนการ
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ทั้งหมด เขียนของคุณเองคำสั่งวัตถุ หรือใช้เครื่องมือข้อมูลแสดงผลที่จะเขียนแฟ้มเหล่านั้น
ลักษณะการทำงานนี้เกิดจากการออกแบบ
ขั้นตอนในการทำให้สถานการณ์เกิดขึ้นอีกครั้ง
- สร้างโครงการใหม่ของแอพลิเคชัน Windows Visual Basic form1 ถูกเพิ่มเข้าไปในโครงการที่เป็นค่าเริ่มต้น
- คลิกสองครั้งที่รูปแบบ และเพิ่มรหัสต่อไปนี้ที่ด้านบนของหน้าต่างรหัส:
Imports System.Data.SqlClient
- เพิ่มคำปุ่มควบคุมการ Form1
- คลิกสองครั้งปุ่ม และเพิ่มโค้ดต่อไปนี้ไปคลิกเหตุการณ์:
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)
- แก้ไขสายอักขระการเชื่อมต่อการเชื่อมต่อกับคอมพิวเตอร์ของคุณ Microsoft SQL Server
- กดแป้น F5 เพื่อเรียกใช้รหัส
- ข้อคิดเห็นออกบรรทัดต่อไปนี้เพื่อแก้ไขปัญหานี้:
da1.Update(custDS, "Customers")
การแก้ปัญหานี้ได้เนื่องจากการทำงาน
CommandBuilderhooks
RowUpdatingเหตุการณ์บนการ
DataAdapter("da1") ดังนั้นจึงทราบเวลาที่จะสร้างคำสั่ง เมื่อคุณคัดลอกคำสั่งไปที่แตกต่างกัน
DataAdapter("da2"),
CommandBuilderไม่ hooked ลงในเหตุการณ์นั้น และไม่เปลี่ยนดังกล่าว
ขอบเขตที่ตัวแปรที่จำเป็นเพราะว่า "da1" และ
SqlCommandBuilder("cb") go ออกจากขอบเขต และ ถ้าเกิด ขึ้นในคอลเลกชันเบจ
CommandBuilderตั้งค่าของคำสั่ง
ไม่มีสิ่งใด(
ว่างใน Visual c#) ซึ่ง คุณไม่สามารถใช้คำสั่งเหล่านี้ได้ใน "da2" เนื่องจากคอลเลกชันเบจอาจเกิดขึ้นในสุ่ม เวลา
da2.Updateการเรียกเมธอดอาจยกข้อผิดพลาด NullReferenceException เป็นระยะ ๆ
หมายเลขบทความ (Article ID): 310366 - รีวิวครั้งสุดท้าย: 10 มกราคม 2554 - 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
| kbtshoot kberrmsg kbprb kbsqlclient kbsystemdata kbmt KB310366 KbMtth |
แปลโดยคอมพิวเตอร์ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:
310366
(http://support.microsoft.com/kb/310366/en-us/
)