سؤال

الطريقة التي تفضل لخلق ديناميكية استعلامات sql?صيغة أو البث ؟ هل هو مجرد تفضيل أو هناك سبب واحد هو أفضل من الآخر ؟ أو أي مكتبة استخدام لها.

تحرير:الرجاء الإجابة في حالة c++.

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

المحلول 3

وهناك بعض الشيء يسمى SOCI - وC ++ مكتبة قاعدة بيانات Access للحصول على C ++

نصائح أخرى

ودائما استخدام "إعداد" لن يكون هناك ما يعادل prepareStatement لكن اسم الدالة المحدد سيعتمد على مزيج قاعدة البيانات والسائق الخاص بك.

ومزايا بيان معد سلفا على مدى تنفيذ (سلسلة) كثيرة: -

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

وأنت لا داعي للقلق حول الأحرف الخاصة في سلسلة البيانات عند تمريرها عبر setString (). في تنفيذ (سلسلة) أي علامات الاقتباس المفردة أو الفاصلة المنقوطة في البيانات سوف يؤدي إلى خطأ في تحليل.

والأسوأ من هذا هو كيف "حقن SQL" هجمات العمل. إذا كان شيئا سلسلة مثل "س" من cust_table، حذف من cust_table، حدد ". وكما دخلت البيانات التي قد تؤدي جيدا في بيان حذف يجري تحليل وتنفيذ

والتعامل مع الأرقام هي أكثر كفاءة. دعوة setInt تأخذ قيمة عددية كما هو لسلسلة مكافئا SQL يجب عليك تحويل إلى أحرف ثم DBMS أن تحويله مرة أخرى إلى عدد صحيح.

والمقروئية. أن رمز عبارة SQL واحدة مع بضع علامات استفهام أين تذهب المتغيرات التي من السهل نسبيا أن يقرأ، بدلا من توزيع عقليا وتحليل سلسلة من concatinations سلسلة سوف ضجيج إضافية ليقتبس هرب الخ.

ولكن هناك اثنين من الحالات التي يكون فيها تنفيذ (سلسلة) هو في الواقع أفضل.

وأين يتم توزيعها بشكل غير متساو للغاية المفاتيح الخاصة بك. E.G. إذا 95٪ من الزبائن تعيش في الولايات المتحدة وتريد سرد 4٪ الذين يعيشون في كندا ثم "حيث البلاد =؟" من شأنه أن يؤدي عادة في مسح مساحة الجدول بينما مع "حيث البلاد =" CA "لديك بعض فرصة استخدام فهرس.

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

في جاوة يجب عليك استخدام PreparedStatement .

PreparedStatement statement = connection.prepareStatement("SELECT * FROM Table WHERE ID = ?");
statement.setInt(1, 17);
ResultSet resultSet = statement.executeQuery();

عند استخدام إعداد البيانات غير ممكن, أجد باستخدام C++ تيارات هي أفضل طريقة كتابة الاستعلام:

std::ostringstream sql;
sql << "exec loadStuff(" << param1 << ", " << param2 << ")";

لا الحاجة إلى القلق حول أنواع المعلمات و طول السلسلة هو عظيم!

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