سؤال

SQLServer الباحث الميداني.قيمة في بعض الأحيان فارغة.DataAdapter يملأ البيانات موافق و يمكن عرض البيانات في DatagridView موافق.

عند محاولة استرداد البيانات برمجيا من قاعدة البيانات الميدانية استرجاع رمز يلقي StronglyTypedException خطأ.

 [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public int curr_reading {
        get {
            try {
                return ((int)(this[this.tableHistory.curr_readingColumn]));
            }
            catch (global::System.InvalidCastException e) {
                throw new global::System.Data.StrongTypingException("The value for column \'curr_reading\' in table \'History\' is DBNull.", e);
            }

حصلت في الماضي هذا عن طريق التحقق من DBNull في الحصول على accessor والعودة فارغة ولكن...عندما dataset تم تعديل بنية (لا تزال النامية) تغيير (غرابة) قد ولت.

ما هي أفضل طريقة للتعامل مع هذا الوضع ؟ يبدو أنا عالقة مع التعامل معها في dataset المستوى.هل هناك نوع من السمة التي يمكن معرفة السيارات مولد رمز ترك التغييرات في المكان ؟

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

المحلول

ومجموعة البيانات سيكون لها خاصية منطقية للإشارة لاغية.

int curr_reading = ( Iscurr_readingColumnNull) ? 
                   <default_value> : row.curr_readingColumn;

نصائح أخرى

في المصمم بيانات كتبته هناك خاصية nullvalue. افتراضيا قيمتها throw exception (وبالتالي الشفرة التي تم إنشاؤها) يمكنك تعيين إلى default value المطلوب .. أي. 0. ثم فإنه سيعود 0 بدلا من استثناء. (يتم إنشاء رمز آخر)

وVS2008: هذا يعمل مباشرة في المصمم بيانات

وVS2005: أنها لا تعمل إلا لسلاسل في المصمم ولكن يمكنك مباشرة تحرير XSD مجموعة من msprop الملكية: nullValue = "0"

  1. ترك السيارات التعليمات البرمجية التي تم إنشاؤها وحده.لا توجد طريقة "اعتراض" من الحصول على ولدت لذلك أي تغييرات قمت بعمل مضمونة للحصول على مهب عاجلا أو آجلا.

  2. .صافي (حسنا على الأقل .NET 2.0 نظام.البيانات بت) سوف يتم تحويل من DBNull إلى أي شيء آخر.هذا مقرف ولكن لا يمكنك أن تفعل أي شيء حيال ذلك.

  3. كتابة امتداد طريقة تسمى ToNullable() أو ما شابه:يمكن أن تفعل هذا:

.

public static Nullable<T> ToNullable(this object x){
    if(x == DBNull.Value)
       return default(T); // return null thing
    else
       return (T)x;
}

ثم يمكنك أن تفعل

int? thing = DataRow["column"].ToNullable<int>();

إذا أسعفتني الذاكرة، تحتاج إلى علامة الصف كما يتم تحريره - باستخدام .BeginEdit () أو ما شابه ذلك - ثم إجراء تعديلات وحفظ صف واحد، ربما باستخدام .EndEdit () أو ما شابه ذلك. قد تريد القيام به قليلا من القراءة إلى هذه الأساليب (التي قد تكون على مجموعة البيانات أو DataTable أو DataRow) - ذاكرتي قليلا ضبابي

وآمل أن يساعد هذا على الأقل قليلا.

if(row["curr_reading"] is DBNull){

}else{
    row.curr_reading;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top