سؤال

أنا مواجهة مشاكلين ...

(1) عندما أحاول الكتابة إلى قاعدة بيانات (SQLite) باستخدام Delphi XE6، أحصل دائما على قاعدة البيانات رسالة خطأ مؤمنة.أنا متأكد من أنني أغلق قاعدة البيانات في كل مرة أحصل عليها باستخدام الأمر FDConnection1.Close؛

(2) كيف يمكنني إدراجها في جدول من المعلمات الواردة؟ لدي المعلمات الواردة التالية

giveacodicetagpre.

وحاولت الكتابة في الجدول مع الأمر SQL التالي:

giveacodicetagpre.

ولكن لا يبدو أنه يعمل ...

ما يلي هو الإجراء الكامل الذي أواجه مشكلة في

giveacodicetagpre.

أي تلميحات سيكون موضع تقدير كبير.شكرا مقدما.

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

المحلول

هناك تقنيتين لتنفيذ عبارة SQL ديناميكية. ولكن سأستمر SQL أقصر، للتركيز على المنطق:

الطريقة النقية (باستخدام المعلمات)

giveacodicetagpre.

الطريقة القذرة (بناء SQL)

giveacodicetagpre.

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

ولكن إذا قمت بذلك مع المعلمات (الطريقة النقية)، فأنت محمي تلقائيا من حقن SQL، حيث يتم التحقق من صحة عبارة SQL بواسطة المحرك، دون معرفة قيم المعلمة. لذلك يعرف هيكل عبارة SQL عن طريق المحرك ولا يمكن تغييره بواسطة القيم الفعلية.

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

=================

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

giveacodicetagpre.

... وهلم جرا.

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

إذا كنت تستخدم المعلمات، يجب أن تهتم Firedac بكل هذا من أجلك؛)

نصائح أخرى

للحصول على القيم في الاستعلام، استخدم المعلمات (يتم توضيح ذلك الوثائق ):

giveacodicetagpre.

(وأشك في أن كل هذه القيم يجب أن تكون حقا سلاسل ...)

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