سؤال

هل هناك طريقة أستطيع أن إنشاء استعلام مقابل مصدر بيانات (يمكن أن يكون SQL، أوراكل أو الوصول) يحتوي على بند حيث يشير إلى ArrayList أو قائمة؟

وعلى سبيل المثال:

Select * from Table where RecordID in (RecordIDList)

ولقد رأيت بعض الطرق للقيام بذلك مع ينق، لكنني أفضل عدم اللجوء إلى أنه إذا كان من الممكن تجنبه.

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

المحلول

هل يمكن استخدام String.Join. جرب شيئا من هذا القبيل:

String query = "select * from table where RecordId in ({0});";
String formatted = String.Format(query, String.Join(",", list.ToArray()));

وكملاحظة جانبية هذا لن حمايتك ضد حقن SQL -. نأمل أن هذا المثال يشير لك في الاتجاه الصحيح

نصائح أخرى

وLINQ إلى SQL. يجب أن يكون RecordList على List<T>، وليس ArrayList أو IList<T>

IEnumerable<TableRow> query =
  from t in db.Table
  where RecordList.Any(r => t.RecordId == r)
  select t;

وهذا سوف يولد مزود مع المعلمات:

SELECT *
FROM Table
WHERE RecordId in (@p0, @p1, @p2, @p3, @p4)

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

ولقد فعلت فقط ما لديك في محاولة للقيام مع قائمة مفصولة بفواصل

Select * from Table where RecordID in (1,2,34,45,76,34,457,34)

وأو حيث تأتي النتائج من اختيار منفصلة

Select * from Table where RecordID in (select recordId from otherTable where afieldtype=1)

وأنا متأكد من أنك لا يمكن أن تحقق ما كنت بعد ....

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

ومنها مثلا.

StringBuilder sql = new StrignBuilder("select * from Table where ");
for  (int i = 0; i < RecordIDLis.Length; i++)
{
    if (i > 0) sql.Append (" OR ");
    sql.Append(" RecordID = @param" + i.ToString() + " ");
    IDbDataParameter param = new Param();
    param.value etc.
}

يمكنك كتابة دالة لجدول ذات المعرفة التي تأخذ قائمة معرفات وإنشاء جدول، ثم الانضمام امام نظيره نتيجة لهذه الوظيفة. توضح هذه المقال من قبل اللاعب Erland Sommarskog كيفية القيام بذلك.

وأو، هل يمكن استخدام معلمات الجدول، جديدة في خادم SQL 2008 (على ما أظن).

وأو كما قال مانو، يمكنك استخدام XML.

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

<ع> استخدام LINQ إلى SQL وأفترض إطار الكيان يمكنك القيام بما يلي:

dataContext.Table.Where(t => RecordIDList.Contains(t.RecordID));

وسوف تعمل مع كل من قائمة <> وArrayList لأن كلا منهما تنفيذ IEnumerable.

وينق وLambdas تتطلب منك عكس يحتوي على طريقة ولكنه عمل ويولد SQL "IN ()" شرط.

إذا كنت تستخدم SQL الديناميكي، يمكنك إرسال المحتوى من الأقواس على شكل قائمة مفصولة بفواصل حرفية. وإلا يمكنك استخدام متغير XML لإرسال قيم متعددة. انظر http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm

تجدر الإشارة LINQ إلى SQL = ميت، المصدر: <لأ href = "http://blogs.msdn.com/adonet/archive/2008/10/29/update-on-linq-to-sql-and- LINQ إلى كيانات roadmap.aspx "يختلط =" نوفولو noreferrer "> http://blogs.msdn.com/adonet/archive/2008/10/29/update-on-linq-to-sql-and-linq -to-كيانات roadmap.aspx

وإطار الكيان هو ما يجب أن تستخدم حاليا إذا كنت ترغب في تنفيذ هذه العمارة.

وعلاوة على ذلك إذا كنت تستخدم استعلام تحديد آخر (مثل يقترح GordonB) لبك "في" شرط أنه سيكون من الأفضل لاستخدام "موجود" بدلا من "في" على سبيل المثال:

select * from tablename where exists (select id from othertablename where fieldtype=1)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top