ما عدا ينبغي أن يلقى عندما ADO.NET الاستعلام لا يمكن استرداد البيانات المطلوبة?
سؤال
في محاولة لإضافة بعض المعلمة التثبيت و الاستخدام الصحيح دلالات على التطبيق لدينا ، ونحن نحاول إضافة الصحيح معالجة الاستثناء لدينا .تطبيقات NET.
سؤالي هو:عندما رمي في استثناءات ADO.NET إذا قام الاستعلام بإرجاع أية بيانات أو بيانات لا يمكن العثور على أي نوع من الاستثناء يجب استخدامها ؟
Psuedocode:(قراءة, لا تدقق دلالات الرمز ، أنا أعلم أنه لن ترجمة)
public DataSet GetData(int identifier)
{
dataAdapter.Command.Text = "Select * from table1 Where ident = " + identifier.toString();
DataSet ds = dataAdapter.Fill(ds);
if (ds.table1.Rows.Count == 0)
throw new Exception("Data not found");
return ds;
}
المحلول
على MSDN التوجيهية الدولة:
النظر في رمي الاستثناءات الحالية المقيمين في نظام مساحات بدلا من إنشاء مخصص استثناء أنواع.
إنشاء ورمي مخصص الاستثناءات إذا كان لديك حالة الخطأ التي يمكن التعامل معها برمجيا بطريقة مختلفة عن أي الاستثناءات الحالية.وإلا رمي واحدة من الاستثناءات الحالية.
لا خلق و رمي الجديد الاستثناءات فقط أن يكون فريقك هو الاستثناء.
لا توجد قاعدة جامدة وسريعة:ولكن إذا كان لديك سيناريو لعلاج هذا الاستثناء بشكل مختلف ، والنظر في إنشاء مخصص نوع الاستثناء ، مثل DataNotFoundException كما اقترح من قبل يوهان Buret.
وإلا فإنك قد تنظر في رمي واحد من القائمة استثناء أنواع ، مثل نظام.البيانات.DataException أو ربما حتى النظام.مجموعات.Generic.KeyNotFoundException.
نصائح أخرى
بقدر ما ADO.net قلق استعلام بإرجاع صفر الصفوف ليس خطأ.إذا كان التطبيق الخاص بك يرغب في علاج مثل هذا الاستعلام خطأ ، يجب عليك إنشاء الخاصة بك استثناء فئة من وراثة من استثناء.
public class myException : Exception
{
public myException(string s) : base()
{
this.MyReasonMessage = s;
}
}
public void GetData(int identifier)
{
dataAdapter.Command.Text = "Select * from table1 Where ident = " + identifier.toString();
DataSet ds = dataAdapter.Fill(ds);
if (ds.table1.Rows.Count == 0)
throw new myException("Data not found");
}
كنت حقا ينبغي أن تحدد بنفسك استثناء :DataNotFoundException.
يجب عدم استخدام الطبقة الأساسية استثناء ، منذ متى سوف قبض عليه في كود الاتصال ، سوف أكتب شيئا مثل
try
{
int i;
GetData(i);
}
catch(Exception e) //will catch many many exceptions
{
//Handle gracefully the "Data not Found" case;
//Whatever else happens will get caught and ignored
}
حيث اصطياد فقط DataNotFoundEXception سوف تحصل فقط في حال كنت حقا تريد التعامل معها.
try
{
int i;
GetData(i);
}
catch(DataNotFoundException e)
{
//Handle gracefully the "Data not Found" case;
} //Any other exception will bubble up
هناك فئة مسمى SqlException ، عندما تكون هناك مشاكل مع SQL المحرك ولكن من الأفضل ألا تفرط مع الأعمال التجارية الخاصة بك المنطق