كيفية تحديث DataSet Paltry & Child Tables مع مفتاح الهوية البحري؟

StackOverflow https://stackoverflow.com/questions/931630

  •  06-09-2019
  •  | 
  •  

سؤال

أنا أستخدم مجموعات بيانات ADO.NET في تطبيقات VB الخاصة بي. لدي مجموعة بيانات مكتوبة مع طاولة أحد الوالدين والعديد من طاولات الأطفال. أريد توليد مفتاح الهوية عند إدراج البيانات في جدول الوالدين ثم قم بتحديث البيانات في جميع جداول الأطفال بنفس المفتاح (كإجراء فوري).

في النهاية، أريد تحديث DataSet في قاعدة البيانات (SQL Server08).

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

لكنني أريد أن يكون هذا كعملات تلقائية (مثل LinQ إلى SQL التي تعتني بالمفتاح الابتدائي والأجنبي في DataContext.)

أنا شيء ممكن في مجموعة البيانات التي تعتني بالعمود البحري لجداول الوالدين والطفل؟

شكرا،

abb.

لا يوجد حل صحيح

نصائح أخرى

أعتقد أن هذا يجب أن يكون أكثر وضوحا ويجب أن يعمل دون أي تغيير. ولكن لا يزال، إنه سهل جدا.

الحل لديه جزأين:

  1. خلق DataRelation بين طاولات الأطفال والأمهات وتعيينها إلى Cascade على التحديثات. بهذه الطريقة كلما تغير معرف الوالدين، سيتم تحديث جميع الأطفال.

    Dim rel = ds.Relations.Add(parentTab.Columns("Id"), childTab.Columns("ParentId"))
    rel.ChildKeyConstraint.UpdateRule = Rule.Cascade
    
  2. توجد أوامر إدخال البيانات وتحديثها في اتجاهين: إذا كان هناك أي معلمات إخراج ملزمة أو يتم إرجاع أي صفوف بيانات، فسيتم استخدامها لتحديث صف البيانات الذي تسبب في التحديث.

    هذا مفيد للغاية بالنسبة لهذه المشكلة بالذات: الحصول على الأعمدة البحري مرة أخرى إلى التطبيق. بصرف النظر عن الهوية قد يكون هذا على سبيل المثال عمود زمني. لكن الهوية مفيدة للغاية.

    كل ما نحتاج إلى القيام به هو تعيين أمر إدراج للعودة الهوية. هناك عدة طرق للقيام بذلك، على سبيل المثال:

    أ) استخدام الإجراء المخزن مع معلمة الإخراج. هذه هي الطريقة الأكثر محمولة بين قواعد البيانات "الحقيقية".

    ب) باستخدام عبارات SQL متعددة، مع آخر صف إدراج آخر إدراج. هذا هو AFAIK خاص ب SQL Server، ولكن أبسط:

    insert into Parent (Col1, Col2, ...) values (@Col1, @Col2, ...);
    select * from Parent where Id = SCOPE_IDENTITY();
    

بعد إعداد هذا الأمر، كل ما عليك فعله هو إنشاء صفوف الأصل مع IdS التي هي فريدة من نوعها (داخل مجموعة بيانات واحدة) ولكن المستحيل في قاعدة البيانات. الأرقام السالبة عادة ما تكون خيارا جيدا. ثم، عند حفظ تغييرات DataSet إلى قاعدة البيانات، ستصل جميع صفوف الوالد الجديدة IdS من قاعدة البيانات.


ملاحظة: إذا حدث العمل مع قاعدة البيانات دون أن تدعم بيانات متعددة وبدون إجراءات مخزنة (مثل الوصول)، فستحتاج إلى إعداد معالج الأحداث RowUpdated الحدث في محول الجدول الأصل. في هانلر تحتاج إلى الحصول على الهوية select @@IDENTITY أمر.


بعض الروابط:

زوجين من الأشياء التي يجب الإشارة إليها.

  1. نعم، تحتاج بالتأكيد إلى علاقات مخصصة لكلا الجداول. يمكنك التحقق من محرر XSD (انقر نقرا مزدوجا فوق ملف XSD الخاص بك). بشكل افتراضي، يتم تعيين العلاقة ك "علاقة فقط" التي لا تحتوي على أي "قاعدة التحديث". قم بتحرير هذه العلاقة بالانتقال إلى "تحرير العلاقة" وحدد "قيد مفتاح خارجي فقط" أو "كلاهما ~~~". وتحتاج إلى تعيين "تحديث القاعدة" كما يتوسل! "حذف القاعدة" متروك لك.

  2. الآن عند استخدام معرف صف جدول الوالدين الجديد (AutoInCrement) بالنسبة للصفوف الجدد للطفل كجزء أجنبي، يجب عليك إضافة الصف الأصل إلى الجدول أولا قبل استخدام معرف صف الأصل الجديد حولها.

  3. بمجرد استدعاء التحديث للجدول الأصل باستخدام التزويد، سيكون لدى صفوف جدول الطفل المرتبطة PRIMENTID الصحيحة تلقائيا.

بلدي القشرز البسيط

'--- Make Parent Row
Dim drOrder as TOrderRow = myDS.TOder.NewTOrderRow
drOrder.SomeValue = "SomeValue"
myDS.TOrder.AddTOrderRow(drOrder) '===> THIS SHOULD BE DONE BEFORE CHILD ROWS

'--- Now Add Child Rows!!! there are multiple ways to add a row into tables....
myDS.TOrderDetail.AddTOrderDetailRow(drOrder, "detailValue1")
myDS.TOrderDetail.AddTOrderDetailRow(drOrder, "detailvalue2")
'....
'....

'--- Update Parent table first
myTableAdapterTOrder.Update(myDS.TOrder)
'--- As soon as you run this Update above for parent, the new parent row's AutoID(-1)
'--- will become real number given by SQL server. And also new rows in child table will
'--- have the updated parentID

'--- Now update child table
myTableAdapterTOrderDetail.Update(myDS.TOrderDetail)

اتمني ان يكون مفيدا!

وإذا كنت لا ترغب في استخدام مجموعات البيانات، ومع ذلك احصل على المعرفات المعينة للأطفال والحصول على المعرفات حتى تتمكن من تحديث النموذج الخاص بك:https:/danielwertheim.wordpress.com //10/10/24/c-batch-imentity-inserts/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top