أفضل الممارسات لاسترجاع البيانات التي تلبي الشروط المحددة

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

  •  05-07-2019
  •  | 
  •  

سؤال

ولدي اسمه الدعوة جدول قاعدة البيانات مع الأعمدة call_time، والموقع، emergency_type وهناك ثلاثة أنواع من حالات الطوارئ: الإسعاف والشرطة ورجال الاطفاء. في شكل النوافذ أنا خلقت خانات الاختيار "المسعفين '،' الشرطة '،' رجال الاطفاء وأريد أن استرداد كافة أعمدة الجدول التي تلبي اختيار المستخدم.

وأنا خلق وظيفة:

public static DataTable GetHistory(DateTime from, DateTime to, bool paramedics, bool police, bool firefighters)
    {
        string select =
            "SELECT call_time, location, emergency_type where call_time between @from AND @to AND";
        if(paramedics)
        {
            select += " emergency_type = 'paramedics' ";
        }
        if(paramedics && police)
        {
           select +=" emergency_type = 'paramedics' OR emergency_type = 'police';
        }
        ...

    }

ولكن هذا الرمز يبدو قذرة جدا لأنه إذا كان هناك 30 نوعا من الطوارئ سيكون هناك 30! سوف مجموعات وأنا الحصول على القديم قبل كتابة كافة البيانات إذا.

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

وشكرا!

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

المحلول

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

public static DataTable GetHistory(DateTime from, DateTime to, List<string> types)
{
 ..
}

وثم تمر في القائمة التي بدت مثل هذه (على سبيل المثال)

List<string> types = 
  new List<string> { "paramedics" };

or 

List<string> types = 
  new List<string> { "paramedics", "police" };

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

string values = "'paramedics', 'police'"

وهناك طريقة بسيطة لإنشاء متغير القيم هي استخدام

string values = string.Empty;
            types.ForEach(s =>
            {
               if (!string.IsNullOrEmpty(values))
                   values += ",";
               values += string.Format("'{0}'", s);

            });

وبالمناسبة هل يمكن استخدام أمر معلمات لتجنب حقن SQL. وبمجرد الانتهاء من سلسلة يمكنك القيام به ببساطة

string select =
 "SELECT call_time, location, emergency_type where call_time between @from AND @to AND emergency_type IN " + values

نصائح أخرى

وهذا هو وسيلة قذرة للقيام بذلك.

string select = "SELECT call_time, location, emergency_type where call_time between @from AND @to AND (1=0";

if(paramedics) { select += " OR emergency_type = 'paramedics' "; }
if(police)     { select += " OR emergency_type = 'police'"; }
if(xyz)        { select += " OR emergency_type = 'xyz'"; }

select += ")";
وينبغي تجنب

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

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

where ... and emergency_type in (?)

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

where ... and emergency_type in(?,?...) -- as many params as there are checked checkboxes.

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

وكنت قد ننظر في تعلم ينق.

وبناء قائمة المستخدم من القيم مقارنة (EmergencyList) واستخدام SQL مع استعلام معلمات باستخدام يحتوي المشغل.

SELECT call_time, 
       location, 
       emergency_type 
where call_time between @from AND @to 
  AND CONTAINS( Emegency_Type, @EmergencyList )
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top