سؤال

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

SqlCommand cmd = new SqlCommand("CREATE VIEW @name AS SELECT @body");
cmd.Parameters.AddWithValue("@name", "foo");
cmd.Parameters.AddWithValue("@body", "* from bar");

يقول لي هناك خطأ "بالقرب من الكلمة الأساسية الرأي" (ويفترض "@name") -- وغني عن القول "CREATE VIEW foo AS SELECT * FROM bar" يعمل مثل بطل.

هل هذا غير ممكن ؟ إذا ليس هناك أفضل طريقة لتنظيف المدخلات قبل تشغيل خلق البيان ؟ في بعض الحالات, الاستعلام الجسم يمكن أن يكون إدخال المستخدم و سوف يشعر أكثر أمنا إذا كان هناك بعض الطرق التي يمكن أن أقول "علاج هذا جسم واحد اختر البيان".ربما ما أطلبه هو مجرد غريب ؟


متابعة 04 نوفمبر:حسنا, نعم, ما أريده هو نوع من مثل حقن SQL عند النزول إلى ذلك ، ولكن أود أن لا يقل عن الحد (إذا كان ليس تماما إزالة) خيار تشغيل هذا الأمر و اسقاط طاولة أو شيء.يمنح المستخدم هذا يعمل كما لا يكون لديك أذونات إسقاط أي الجداول في المقام الأول, ولكن أعتقد أن تحصل على هذه الفكرة.أحب أن يكون وسيلة قائلا: في الواقع ، "This statement will not alter any existing data in any way{ ... }".

الطريقة انها مشفرة الآن هو أن تفعل سلسلة سلسلة في friol's الإجابة, ولكن هذا لا الإبراء على الإطلاق.كنت أشعر على نحو أفضل إذا كان بإمكاني على الأقل فرك المشتبه الشخصيات ، مثل ؛ أو ما إلى ذلك.كنت أتمنى قد يكون هناك وظيفة المكتبة للقيام فرك لي أو شيء على طول هذه الخطوط.

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

المحلول

ربما لم يفهم بشكل صحيح ، ولكن ما يمنعك أن تفعل:

viewname="foo";
viewwhere="* from bar";

SqlCommand cmd = new SqlCommand("CREATE VIEW "+viewname+" AS SELECT "+viewwhere);

نصائح أخرى

المعلمات ليست مجرد سلسلة من التبديلات.هذا هو السبب في التعليمات البرمجية الخاصة بك لن تعمل.

انها مثل كنت غير قادر على القيام

sql = "select * from أوامر حيث orders_id في (?)"

وتمرير "1,2,3,5" كما المعلمة.

المعلمات نوع فحص و يمكن أن تحتوي فقط على القيم العددية IIRC.

حقن SQL.تريد أن النقطة.يجب أن يتم وصل هذه الأشياء.

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

إذا ما كنت في محاولة لمنع هو حقن SQL, ما أود القيام به هو التحقق من أن اسم طريقة العرض فقط يحتوي على أحرف وأرقام ولا T-SQL الكلمات الرئيسية.أود أن آلوس تكون حذرا جدا حول dymanically خلق الجسم.

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