لماذا لا يمكنني استخدام'??'المعامل للنظام.قيمة دبنول?

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

  •  13-09-2020
  •  | 
  •  

سؤال

لدي جدول بيانات أوراكل جلب الأعمدة التي تكون فارغة.لذلك أنا الرقم للحفاظ على رمز لطيفة وبسيطة أن كنت استخدام ??المعامل.ألترناتيفونينومبر هو سلسلة في بلدي ج # نموذج.

AlternatePhoneNumber = customer.AlternatePhoneNumber ?? ""

ومع ذلك ، حتى مع هذا الرمز ما زلت أحصل على الخطأ.

System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.String'.

أنا أعرف ماذا يعني الخطأ ولكن لماذا ??لا يمكن استخدامها على دبنول?ليست فارغة و دبنول أساسا نفس?

يعطيكم الصّحة.

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

المحلول

ال ?? المشغل ينطبق فقط على الفعلية nulls.

null و DBNull.Value ليست هي نفسها; DBNull.Value هو ببساطة كائن نائب.

أيضا ، هذا الاستثناء يأتي من داخل AlternatePhoneNumber الملكية ، قبل الخاص بك ?? ينفذ المشغل.(لا يحتوي الرمز الخاص بك على طاقم عمل).

إذا customer هو صف في مجموعة بيانات مكتوبة ، قم بتغيير العمود NullValue الملكية في المصمم.

نصائح أخرى

null و dbnull ليست هي نفسها.system.dbnull هو كائن فعلي.

المشكلة هي أن AlternatePhoneNumber هو سلسلة.دبنول ليست كذلك.

جرب هذا بدلا من ذلك:

AlternatePhoneNumber = (customer.AlternatePhoneNumber as string) ?? ""

قم بذلك:

giveacodicetagpre.

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

string alternativePhoneNumber = DBNull.Value.Equals(customer) ? string.Empty : ((Customer)customer).AlternatePhoneNumber;

كما تنص الردود الأخرى, null يعني إشارة تشير إلى أي كائن ، في حين DBNull هي فئة مقدمة من ADO.NET إلى اذكر عندما يكون حقل أو قيمة فارغة في قاعدة البيانات (أو في داتاتابل).

بينما يمكنك استخدام مشروط (الثلاثي) عامل التشغيل (?:) أن تفعل ما تريد:

AlternatePhoneNumber = customer.AlternatePhoneNumber is DBNull 
                           ? "" 
                           : customer.AlternatePhoneNumber;

أنا أميل إلى التفاف هذا الأمر في طريقة التمديد:

static class NullExtensions
{
    public static T WhenNull<T>( this object value, T whenNullValue )
    {
        return (value == null || value is DBNull)
            ? whenNullValue
            : (T)value;
    }
}

الذي أجد يجعل رمز أسهل للقراءة والفهم.

AlternatePhoneNumber = customer.AlternatePhoneNumber.WhenNull( "" );

dbnull ليس حقيقيا "فارغا".

"؟؟"- يكتشف المشغل فقط - المراجع الناجمة، وليس الكائنات التي تحث السلوك "Null".

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