هل الخطأ الذي يخزن Unicode في Delphi7؟
في الآونة الأخيرة ، عند استخدام Delphi7 للقيام ببرامج Unicode ، اكتشفت مثل هذه المشكلة ، أي عند استخدام مكون Tadocommand لتنفيذ عبارات SQL ، إذا كان هناك أحرف Unicode في عبارة SQL ، ستظهر الرمز المشتعلة في قاعدة البيانات ، والشيء نفسه صحيح لاستخدام ttntadoquery (استخدام المعلمات لن يكون هناك رمز مشتعلة ، وهنا سنناقش فقط طريقة SQL النقية). ومع ذلك ، فإن Tadocommand نفسه يدعم WideString ، وخاصية CommandText هي أيضًا من نوع العرض. حاولت تغيير العديد من قيم السمات من Tadocommand ووجدت ظاهرة غريبة. لماذا يحدث هذا؟ يبدو أن هذه الخاصية لا علاقة لها بـ Unicode نفسها. من خلال دراسة ملف ADODB.PAS حيث يوجد Tadocommand ، وجدت المشكلة.
الإجراء tadocommand.AssignCommandText (قيمة const: wideString ؛ التحميل: منطقية) ؛
الإجراءات initparameters ؛
var
أنا: عدد صحيح.
القائمة: tparameters ؛
NativeCommand: سلسلة ؛
يبدأ
القائمة: = tparameters.create (الذات ، tparameter) ؛
يحاول
nativeCommand: = list.parsesql (القيمة ، صواب) ؛
{الحفاظ على القيم الموجودة}
list.assignvalues (المعلمات) ؛
commandObject.CommandText: = nativeCommand ؛
إذا لم يكن التحميل و (تعيين (اتصال) أو (connectionString <> '')) ثم
يبدأ
يحاول
setConnectionFlag (cfparameters ، true) ؛
يحاول
{استرداد معلومات المعلمة الإضافية من الخادم إذا كان مدعومًا}
المعلمات. internalrefresh ؛
{استخدم معلومات معلمة إضافية من الخادم لتهيئة قائمتنا}
إذا كانت المعلمات. count = list.count
لأني: = 0 إلى list.count - 1 افعل
يبدأ
قائمة [i] .datatype: = المعلمات [i] .Datatype ؛
قائمة [i] .size: = المعلمات [i] .size ؛
قائمة [i] .numericscale: = المعلمات [i] .Numericscale ؛
قائمة [i] .precision: = المعلمات [i].
قائمة [i] .direction: = المعلمات [i]. الاتجاه ؛
قائمة [i] .attributes: = المعلمات [i] .attributes ؛
نهاية
أخيراً
setConnectionFlag (cfparameters ، false) ؛
نهاية؛
يستثني
{تجاهل الخطأ إذا لم يتمكن الخادم من توفير معلومات المعلمة}
نهاية؛
if list.count> 0 ثم
parameters.assign (قائمة) ؛
نهاية؛
أخيراً
قائمة.
نهاية؛
نهاية؛
يبدأ
if (commandtype = cmdtext) و (value <> '') و paramcheck ثم
initparameters
آخر
يبدأ
commandObject.CommandText: = value ؛
إذا لم يكن التحميل ثم المعلمات.
نهاية؛
نهاية؛
ألق نظرة على هذا البيان:
if (commandtype = cmdtext) و (value <> '') و paramcheck ثم
initparameters
هذا هو ، عندما يكون Paramcheck صحيحًا ، سيتم تنفيذ عملية initparameters.
أولاً ، يحدد المتغير: NativeCommand:
nativeCommand: = list.parsesql (القيمة ، صواب) ؛
{الحفاظ على القيم الموجودة}
list.assignvalues (المعلمات) ؛
commandObject.CommandText: = nativeCommand ؛
هنا ، القيمة من نوع العرض ، وقائمة. إرجاع نوع السلسلة ، و NativeCommand هو أيضا نوع السلسلة. مما يسبب commandObject.CommandText لعدم الحصول على قيمة الأوسع التي يجب تعيينها لها ، مما يؤدي في النهاية إلى حدوث رمز مشتعلة عند تخزين Unicode.
الحل بسيط للغاية أيضًا ، (إذا كنت غير راغبة في تعديل برنامج Delphi Source) ، فأنت بحاجة فقط إلى تعيين ParamCheck على False (Delphi Defaults to ParamCheck إلى True).