سؤال

لم أكن أعمل في SQL لفترة طويلة، لكنني اعتقدت أنني فهمت أنه عن طريق التغليف ببيانات SQL داخل الصفقة، أو فعلت جميع العبارات، أو لم يفعل أي منها. هنا مشكلتي. لدي كائن طلب يحتوي على مجموعة سائل. يتم ارتباط بنود السطر حسب الطلب. LodordID. لقد تحققت ذلك يتم تعيين جميع المعرفات وهي صحيحة ولكن عندما أحاول حفظ (إدراج) الترتيب الذي أحصل عليه بيان إدراج يتعارض مع قيود المفتاح الأجنبي "FK_ORDERITEMDETAIL_ORDER". حدث الصراع في قاعدة البيانات "MyData"، الجدول "dbo.order"، العمود "يرويه".

رمز Psuedo:

إنشاء معاملة المعاملة .begin () إدراج ترتيب إدراج order.lineItems <- يحدث خطأ هنا المعاملة

الرمز الفعلي:

... Entity.Validate ()؛ إذا (Entity.isvalid) {setchangedproperties (كيان)؛ Entity.Install.nagsinstallhours = Entity.totalnagshours؛ foreach (orderitemdetail orderitemdetail في Entity.orderitemdetailCollection) {setchangedorderitemdeailproperties (orderitemdetail)؛ } ValidaterequiredProperties (كيان)؛ TransactionManager TransactionManager = DataRepository.Provider.CroeTetransaction ()؛ Entitystate OriginalentityState = Entity.EntityState؛ جرب {Entity.OrderVehicle.order = Entity.OrderID؛ Entity.Install.orderid = Entity.OrderID؛ transactionmanager.beginransaction ()؛ saveissuranceformation (TransactionManager، كيان)؛ DataRepository.ordReprovider.Save (المعاملات، الكيان)؛ dataRepository.orderItemdetailProvider.Save (المعاملات، Entity.OrderIteMdeAilCollection)؛ إذا (! Entity.OrderVehicle.isembery) {datarepository.ordervehicleprovider.save (المعالجان، الكيان. Lodervehicle)؛ } TransactionManager.comMit ()؛ } Catch {if (tradactionmanager.isopen) {tradactionmanager.rollback ()؛ } Entity.entitystate = OriginalentityState؛ }} ...

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

هل كانت مفيدة؟

المحلول

لقد لاحظت أنك قلت أنك تستخدم Nettiers لتوليدك التعليمات البرمجية.

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

حظا سعيدا مع مشكلتك.

نصائح أخرى

دون رؤية الكود الخاص بك، من الصعب قول المشكلة. قد يكون أي عدد من الأشياء، ولكن انظر إلى هذه:

  1. هذا واضح، لكن أوامر الإدراج الخاصة بك موجودة على نفس الاتصال (والاتصال يبقى مفتوحا طوال الوقت) الذي يمتلك المعاملة أليس كذلك؟
  2. هل تسترجع هويتك المتعلق بالوقيد بعد إدراجها الأولى وكتابةها مرة أخرى إلى البيانات للإدراج الثاني قبل تنفيذ الأمر؟
  3. يمكن إعداد القيد خطأ في DB.

أنت بالتأكيد لا تريد استخدام معاملتين.

يبدو وكأنه بيان الإدراج الخاص بك للاشجار الخاص بك ليس بوضع قيمة بشكل صحيح للنظام .. يجب أن يكون هذا نتيجة Insert order خطوة. هل نظرت (واختبارها) بيانات SQL الفردية؟

لا أعتقد أن مشكلتك لديها علاقة مع التحكم في المعاملات.

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

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

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

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