لماذا لا يمكنني استخدام'??'المعامل للنظام.قيمة دبنول?
سؤال
لدي جدول بيانات أوراكل جلب الأعمدة التي تكون فارغة.لذلك أنا الرقم للحفاظ على رمز لطيفة وبسيطة أن كنت استخدام ??المعامل.ألترناتيفونينومبر هو سلسلة في بلدي ج # نموذج.
AlternatePhoneNumber = customer.AlternatePhoneNumber ?? ""
ومع ذلك ، حتى مع هذا الرمز ما زلت أحصل على الخطأ.
System.InvalidCastException: Unable to cast object of type 'System.DBNull' to type 'System.String'.
أنا أعرف ماذا يعني الخطأ ولكن لماذا ??لا يمكن استخدامها على دبنول?ليست فارغة و دبنول أساسا نفس?
يعطيكم الصّحة.
المحلول
ال ??
المشغل ينطبق فقط على الفعلية null
s.
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".