Quickie - استبدل كافة تكرارات ' (الفاصلة العليا) بـ '' (فواصل عليا) في AnsiString (C++)

StackOverflow https://stackoverflow.com/questions/463816

  •  19-08-2019
  •  | 
  •  

سؤال

أعتقد أنه يمكنك تخمين المشكلة التي أواجهها.أقوم بإدخال أسماء الملفات في قاعدة بيانات SQL في C++ Builder.تحتوي بعض الملفات على علامة اقتباس أحادية في اسمها.يؤدي هذا إلى كسر استعلام إدراج SQL.الطريقة المعتادة لإصلاح ذلك هي مضاعفة الفواصل العليا التي تريدها أن تكون جزءًا من قيمة الحقل.

على سبيل المثال، إذا كنت أرغب في إضافة "جورج" إلى الحقل "المالك"، فسيكون استعلام SQL هو "إدراج في قيم الجدول (المالك) ("جورج")"

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

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

المحلول

والواقع أنني حصلت على الجواب بنفسي ...

item = StringReplace( item, "'", "''", TReplaceFlags() <<rfReplaceAll );

و(حتى لا يكون هناك بنيت في استبدال وظيفة في ANSIString و إنس)

وتحرير: أضيفت علامات التعليمات البرمجية بحيث يمكننا أن نميز بين مختلف يقتبس

نصائح أخرى

لم أستخدم AnsiString، لكن في الأساس سأفعل ما يلي:

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

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

في ++ C باني، كنت تبحث عن وظيفة AnsiQuotedStr، في SysUtils. عكسه هو AnsiExtractQuotedStr. فهي ليست أساليب نوع AnsiString نفسها لأنها لا تحتاج إلى معرفة وثيقة الداخلية نوع من.

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

ملاحظة أنه على الرغم من أسمائهم، وظائف AnsiX تقبل المعلمات UnicodeString، وليس AnsiString، في دلفي و C + + منشئ 2009.

وماذا يحدث إذا كنت بديلا من هذا القبيل

item = StringReplace( item, "'", "\'", TReplaceFlags() );
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top