سؤال

ما هي أفضل طريقة لتشغيل العرف sql بيان باستخدام IN من C # Linq إلى SQL DataContext؟ لقد حاولت:

db.ExecuteCommand(
   "UPDATE tblCard SET used = 1 WHERE id IN ({0}) AND customer_id = {1}",
   Request.Form["ids"], customer_id
);

وهو ما يرام بالنسبة إلى عنصر واحد تم تمريره من خلال النموذج، ولكن إذا تلقيت مرسلة على سبيل المثال "2،1" ثم أحصل على sqlclient استثناء:

فشل التحويل عند تحويل قيمة NVARCHAR "2،1" إلى نوع البيانات INT.

إذا بدلا من ذلك، استخدم String.Format لإدراج المعلمة، فهي تعمل بشكل جيد، ولكن من الواضح أن هذا مفتوح لحقن SQL.

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

المحلول

LinQ-To-SQL لا يستخدم التسلسل؛ سيكون ذلك استعلام TSQL للنموذج:

WHERE id IN (@p0) 

مع @p0 ضبط ل '123,456,789'.

مع LinQ العادية يمكنك استخدامها Contains. وبعد مع ExecuteQuery هناك بعض الخيارات؛ يمكنك، على سبيل المثال، تمرير في CSV "كما هو"، واستخدم UDF لتقسيم هذا في قاعدة البيانات، والانضمام إليه:

UPDATE c SET c.used = 1
FROM dbo.SplitCsv({0}) udf
INNER JOIN tblCard c
        ON c.Id = udf.Value
       AND c.Customer_ID = {1}

أين dbo.SplitCsv هو واحد من العديد من هذه UDFs "الانقسام" المتاحة على شبكة الإنترنت.

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