سؤال

لذلك البرنامج الرئيسي في C #. إدراج سجلات جديدة في جدول قاعدة بيانات VFP. كان يستغرق وقتا طويلا لتوليد المعرف التالي للسجل عبر

select max(id)+1 from table

, ، لذلك أضع هذا التعليمات البرمجية في Compile DLL في VFP وأنا استدعاء كائن COM من خلال C #.

يعرض كائن COM المعرف الجديد في حوالي 250 سم. ثم أفعل الآن تحديث من خلال OLEDB. المشكلة التي أقضيها هي أنه بعد كائن COM إرجاع المعرف المدرج حديثا، لا يمكنني العثور عليه فورا من C # عبر OLEDB

select id form  table where id = *newlyReturnedID*

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

هل تم تشغيل أي شخص آخر في شيء مماثل؟ إذا كان الأمر كذلك، كيف التعامل معها؟

د

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

المحلول

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

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

 هيكل من أجل: countergenerator.dbf اسم قاعدة البيانات: conferencereg.dbc اسم الجدول الطويل: مكافحة جيندراتور عدد السجلات: 0 آخر تحديث: 11/08/2008 مذكرة ملف كتلة الحجم: 64 الرمز الصفحة: 1252 نوع الجدول: Visual FoxPro Nulls الخطوة التالية الافتراضي ------------------------------------------------ -------------------------------------------------- ---------------- 1 ccountergenerator_pk حرف 36 n guid (36) 2 حرف ميكي (ثنائي) 50 y 3 ovelue interge 4 y 4 mnote memo 4 y "تم إنشاؤها تلقائيا" حرف cuserid تلقائيا 30 y 6 tupdated datetime 8 y datetime () datetime datetime () الكلمات: 1. اسم العلامة: الأساسي - النوع: التعبير الأساسي - مفتاح التعبير: ccountergenerator_pk - تصفية: (لا شيء) - الترتيب: تصاعدي - تجميع التسلسل: آلة 2. اسم العلامة: ckey - النوع: تعبير عادي - مفتاح: أقل (CKEY) - فلتر: (لا شيء) - الترتيب: تصاعدي - تجميع التسلسل: الجهاز

الآن رمز الإجراء المخزن في DBC (أو في برنامج آخر) هو هذا:

وظيفة NextCounter (Tcalias)

lcalias المحلية،؛ lnnextValue،؛ lnoldreprocess،؛ lnoldarea.

lnoldarea = حدد ()

إذا المعلمات () <1 lcalias = الاسم المستعار ()

إذا cursorgetprop ("SourceType" ("SourceType") = DB_SRCLOCOCOCOVEVOVEVEVEN * - محاولة الحصول على الجدول الأساسي Lcalias = Lower (cursorgetprop ("جداول")) lcalias = substr (lcalias، at ("!"، lcalias) + 1) hdif آخر lcalias = أقل (Tcalias) حسن

lnordernumber = 0 lnoldreprocess = set ("إعادة المعالجة")

* - قفل حتى يضغط المستخدم على ESC REPROCESS إلى تلقائي

إذا كان ذلك! يستخدم ("مكافحة العدوى") استخدام EventShament! مكافحة العمل في 0 مشترك في الاسم المستعار

حدد مكافحة العمل

إذا طلبت (أقل (LCALIAS)، "مكافحة العدوى"، "CKEY") إذا كان Rlock () LNNEXTVALUE = Countergenerator.viexue استبدال Virtengenerator.viexue مع Countergenerator.viexue + 1 قم بإلغاء تأمين ENTIF آخر * إنشاء السجل الجديد مع قيمة البداية. إلحاق فارغ في مكافحة جدولي مبعثرة MemVar Memo M.CKEY = Lower (Lcalias) M.AVELUE = 1 m.mnote = "تم إنشاؤها تلقائيا عن طريق إجراء مخزن". m.tupdated = dateetime () جمع مذكرة memvar

إذا RLOCK () LNNEXTVALUE = Countergenerator.viexue استبدل عداد الأداء.ليلبو

حدد (Lnoldarea) قم بتعيين إعادة المعالجة إلى LnoldReprocess

عودة LnnextValue EndFunc.

يضمن Rellock () عدم وجود خلاف للسجلات وهو سريع بما يكفي ليس لديه عملية عنق العملية. هذه طريقة أكثر أمانا من النهج الذي تتناوله حاليا.

rick schummer.
VFP MVP.

نصائح أخرى

يحتاج vfp إلى فلوش عملها.

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