سؤال

وأنا باستخدام VS2008 C # Express و قاعدة البيانات Northwind على تطبيق نموذج Windows.

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

وأوامر SELECT. [ترتيب ID]، وأوامر. [ID العملاء]، وأوامر. [معرف الموظف]، وأوامر. [اسم السفينة]، وأوامر. [السفينة العناوين]، وأوامر. [السفينة المدينة]، وأوامر. [السفينة منطقة]،                       أوامر. [السفينة الرمز البريدي]، أوامر. [السفينة البلد]، أوامر. [السفينة عن طريق]، أوامر. [تاريخ الطلب]، أوامر. [تاريخ مطلوب]، أوامر. [يشحن التاريخ]،                       Orders.Freight من أوامر INNER JOIN                       [ترتيب تفاصيل] بناء على أوامر. [ترتيب ID] = [تفاصيل ترتيب]. [ترتيب ID] WHERE (أوامر. [اسم السفينة] مثل٪ N'A ') AND ([تفاصيل ترتيب]. الكمية <20)

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

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

و"فشل تمكين القيود واحد أو أكثر من الصفوف تحتوي على قيم انتهاك القيود غير فارغة، فريدة من نوعها، أو المفاتيح الخارجية."

وماذا أفعل الخطأ؟

وUPDATE: أعتقد أنني أتلقى الخطأ القيد بسبب صلة داخلية تم إنشاؤه بواسطة معالج. إذا كنت تعديل الاستعلام لاستخدام LEFT JOIN ثم معالج يتغير مرة أخرى إلى INNER JOIN.

وسؤالي لا يزال قائما عن كيفية تصفية السجلات في الجدول الرئيسي (أوامر) بناء على معايير من كل من الأم والطفل الجدول. بلدي الاختبار التالي هو محاولة استخدام بروك المخزنة ولكن أود أن أعرف فقط باستخدام طريقة TableAdapter مخصصة FillBy.

والتحيات،

والتصحيح

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

المحلول 3

وبفضل كل ما نشر جوابا. هنا هو كيف فعلت ذلك باستخدام معالج TableAdapter وNORTHWIND كتابة البيانات.

1) الحق فوق الجدول الرئيسي في المصمم XSD لإضافة أو تكوين الاستعلام. 2) انقر على زر "التالي" في معالج حتى ترى زر "منشئ الاستعلام". انقر فوق الزر منشئ الاستعلام للحصول على نفسك في وضع منشئ الاستعلام. 3) انقر بالزر الأيمن وإضافة الجدول التابع في جزء التصميم. يجب أن يكون كلا الجدولين والقيد الافتراضية التي تربط بينها. 4) انقر فوق عمود في الجدول التابع الذي تريد تصفية (سيتم إزالة هذا علامة الاختيار في وقت لاحق) من أجل إضافته إلى معايير الجزء حتى تتمكن من تصفية عليه. 5) إضافة فلتر لالأم والطفل الأعمدة. في هذا المثال، I تصفية السفينة اسم LIKE 'A٪ "والنظام الكمية <20.

لاحظ أنه عند هذه النقطة يمكنك اختبار الاستعلام الخاص بك عن طريق النقر على زر تنفيذ الاستعلام. باستخدام NORTHWIND DB لSQL 2008 طبعة المدمجة أحصل عادت 53 الصفوف. لو كنت لحفظه في هذه المرحلة سيكون تفشل في وقت التشغيل بسبب المفاتيح الأساسية مكررة في مجموعة نتائج. وبالتالي فإن التخلص الخطوات القليلة المقبلة من 'م.

و6) في الجزء المعايير، قم بإلغاء تحديد عمود الجدول التابع الذي قمت بإضافته سابقا. سيبقى مرشح وسيتم الآن ازل العمود نفسه في الجزء التصميم كذلك. إذا قمت بتشغيل الاستعلام سوف لا تزال لديها 53 الصفوف ولكن من دون عمود الجدول التابع. 7) انقر على الحق في جزء تصميم وإضافة "تجميع حسب". عند هذه النقطة، عند تنفيذ هذا الاستعلام، يجب أن يكون هناك مكررة في معرف الطلب. حصلت بالضبط عادت 29 الصفوف. 8) انقر فوق موافق ثم انقر فوق الزر "التالي" حتى يتم حفظ الخاص بك الاستعلام FillBy الجديد. 9) تغيير التعليمات البرمجية المصدر لاستخدام FillBy الجديد.

عند ركضت التطبيق، حصلت على الجدول الرئيسي تصفيتها مع نفس 29 الصفوف التي زر الاستعلام تنفيذ عاد. عملت الجدول التابع كما هو متوقع ويتضمن الصف طفل واحد على الأقل التي تحتوي على كمية <20.

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

نصائح أخرى

وتحتوي هذه المقالة على بعض الاقتراحات استكشاف الأخطاء وإصلاحها لتحديد الصف المحدد يسبب المشكلة:

<وأ href = "http://osherove.com/blog/2004/10/3/dataset-hell-failed-to-enable-constraints-one-or-more-rows-c.html" يختلط = "نوفولو noreferrer"> مجموعة البيانات الجحيم - "فشل في تمكين القيود واحد أو أكثر من الصفوف تحتوي على قيم ...."

إذا نظرتم في Orders.Designer.cs (التخمين، وأنا أعمل في VB)، هل من المحتمل رؤية قيد فريد المعرفة على أوامر (على المفتاح الأساسي).

وأظن أن المشكلة هي عند تشغيل الاستعلام الخاص بك، كنت الحصول على واحد أو أكثر ترتيب الفردي الذي> 1 OrderDetails.Quanity> 20 .... حتى، سيتم إرجاع ذلك الأمر مرتين في resultset والخاص، وانتهاك المفتاح الأساسي.

وجرب: * SELECT من أوامر حيث [السفينة اسم] LIKE '٪ مهما٪ ومعرف الطلب في (حدد OrderID من ORDERDETAILS حيث الكمية <20)

وهذا هو الأرجح وسيلة غير فعالة للغاية للقيام بذلك، في أوراكل ستستخدم المشرقية () بدلا من IN () ولكن أنا لا أعرف ما يعادل مزود خدمة.

ونرجو منكم حصلت الإجابة على هذا ولكن إن لم يكن، وإعطاء هذا الفكر.

في مجموعة البيانات الخاصة بك إذا لديهم DataTables النظام وOrderDetail علاقة بينهما ثم يعمل الى حد ما مثل عائقا FK. لذلك، يمكن أن يكون هناك أية سجلات في الجدول التابع (OrderDetail) التي ليس لديها سجل cooresponding الأم (الأمر). ذلك ما يمكن أن يحدث هو عند تحديث النظام DataTable و، مع الاستعلام الذي ذكر أعلاه، لا يزال هناك صفوف الأطفال في الجدول OrderDetail التي سيكون لها refrernces لالرئيسي السجلات (الأمر) أن لن يكون هناك بعد التحديث. ومع ذلك، إذا قمت بتحديث النظام DataTable وتحتاج أيضا إلى تحديث بيانات الجدول OrderDetail، أو إزالة العلاقة بين DataTables اثنين.

ويساعد هذا الأمل ...

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