قد إعادة إنشاء كائن CommandBuilder أمر محاولة تعديل أثناء استدعاء التالي إلى الأسلوب DataAdapter.Update و قد يتم فقدان التغييرات إلى الأمر

هام: تمت ترجمة هذا المقال باستخدام برنامج ترجمة آلية لشركة مايكروسوفت بدلاً من الاستعانة بمترجم بشري. تقدم شركة مايكروسوفت كلاً من المقالات المترجمة بواسطة المترجمين البشر والمقالات المترجمة آليًا وبالتالي ستتمكن من الوصول إلى كل المقالات الموجودة في قاعدة المعرفة الخاصة بنا وباللغة الخاصة بك. بالرغم من ذلك، فإن المقالة المترجمة آليًا لا تكون دقيقة دائمًا وقد تحتوي على أخطاء إملائية أو لغوية أو نحوية، مثل تلك الأخطاء الصادرة عن متحدث أجنبي عندما يتحدث بلغتك. لا تتحمل شركة مايكروسوفت مسئولية عدم الدقة أو الأخطاء أو الضرر الناتج عن أية أخطاء في ترجمة المحتوى أو استخدامه من قبل عملائنا. تعمل شركة مايكروسوفت باستمرار على ترقية برنامج الترجمة الآلية

310366
تمت أرشفة هذه المقالة. وتظهر "كما هي" ولن يتم تحديثها بعد الآن.
تشير هذه المقالة إلى مساحة الاسم Microsoft .NET Framework فئة مكتبة التالية:
  • System.Data.SqlClient
الأعراض
قد إعادة إنشاء كائن CommandBuilder أمر محاولة تعديل أثناء استدعاء التالي إلى الأسلوب DataAdapter.Update ثم قد يتم فقدان التغييرات إلى الأمر. تحدث هذه المشكلة الحالات التالية:
  • إذا كان يجب إقران كائن CommandBuilder كائن DataAdapter.
  • إذا استخدمت الأسلوب GetInsertCommand أو GetUpdateCommandGetDeleteCommand للكائن CommandBuilder لتعيين أوامر DataAdapter بشكل صريح.
  • إذا قمت بتعديل أحد الأوامر التي تنشئ CommandBuilder.
عند محاولة استدعاء الأسلوب تحديثDataAdapter قد تتلقى رسالة الخطأ التالية:
حدث استثناء غير معالج من النوع 'System.Data.SqlClient.SqlException' في system.data.dll
السبب
تحدث هذه المشكلة بسبب تبديل CommandBuilder بشكل حيوي على الأوامر التي تنشئ مرة أخرى إلى الأمر الأصلي.
الحل
لحل هذه المشكلة استخدم إحدى الطرق التالية:
  • لا تقم بتعديل الأوامر التي تنشئ CommandBuilder. لا يبدل CommandBuilder الكائنات الأوامر إنشاء بنفسك.
  • لنسخ كائنات InsertCommand و DeleteCommandUpdateCommand جديد DataAdapter (راجع قسم "مزيد من المعلومات" للحصول على مثال). يجب أن يكون متغير DataAdapter جديد في نفس النطاق أو أضيق كمتغير DataAdapter القديم.
  • عدم استخدام CommandBuilder الإطلاق. كتابة كائنات الأوامر الخاص بك أو استخدام "أدوات البيانات مرئية" إلى كتابتها.
تصريح
يعتبر هذا السلوك حسب التصميم.
معلومات أخرى

خطوات إعادة إنشاء في سلوك

  1. إنشاء مشروع Visual Basic تطبيق Windows جديد. يتم إضافة 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")					
يعمل هذا الحل لأن CommandBuilder ربط الحدث RowUpdating على DataAdapter ("da1") بحيث يعلم عند إنشاء الأوامر. عند نسخ الأوامر إلى مختلفة DataAdapter ("da2") CommandBuilder لم يعد يتم ربط إلى الأحداث الخاصة به ثم لا يبدل عليها.

نطاق المتغير مهماً لأنه إذا "da1" و SqlCommandBuilder ("cb") الانتقال خارج النطاق وفي حالة حدوث المهملة CommandBuilder تعيين وأوامرها إلى شيء (أو فارغة في "Visual C" #). وبالتالي، لا يمكنك استخدام هذه الأوامر في "da2." لأن قد تحدث المهملة في أوقات عشوائية ، قد رفع استدعاء الأسلوب da2.Update أخطاء NullReferenceException متقطعة.
لم يتم حفظه تأثير تأخذ

تحذير: تمت ترجمة هذا المقال تلقائياً

خصائص

رقم الموضوع: 310366 - آخر مراجعة: 02/28/2014 04:30:31 - المراجعة: 1.7

  • Microsoft ADO.NET 2.0
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic 2005
  • kbnosurvey kbarchive kbmt kbtshoot kberrmsg kbprb kbsqlclient kbsystemdata KB310366 KbMtar
تعليقات