استخدام موجز من dbnull؟ (الثلاثية؟)
-
27-09-2019 - |
سؤال
يبدو أن هناك نوعًا من الارتباك في المشغل الثلاثية. أعلم أن هذا قد تمت معالجته في خيوط أخرى ، لكنه كان دائمًا مع Nullables. أيضًا ، بالنسبة لحالتي ، أبحث فقط عن طريقة أفضل.
أود أن أكون قادرًا على الاستخدام
proc.Parameters[PARAM_ID].Value =
string.IsNullOrEmpty(dest.Id) ? DBNull.Value : dest.Id;
لكن بدلاً من ذلك ، أنا عالق مع هذا:
if (string.IsNullOrEmpty(dest.Id))
{
proc.Parameters[PARAM_ID].Value = DBNull.Value;
}
else
{
proc.Parameters[PARAM_ID].Value = dest.Id;
}
يفشل المشغل الثلاثية لأنه لا يوجد تحويل ممكن بين DBNULL والسلسلة ، وبقدر ما يبدو أن القيمة بالنظر إلى أن القيمة هي الكائن ، فإن المترجم يعيده إليّ وأنا أجبر على العناية. إن الإجابة على النسخة البارزة من هذا السؤال هي مجرد إلقاء NULL على السلسلة والقيام بها ؛ لا يمكن إلقاء DBNULL على سلسلة ، على الرغم من ذلك ، لذلك لا حظ هناك.
هل هناك طريقة أكثر إيجازًا للقيام بذلك (دون استخدام Nullables ، بالمناسبة؟)
شكرًا!
المحلول
يمكنك تغيير بيانك الأول إلى:
proc.Parameters[PARAM_ID].Value =
string.IsNullOrEmpty(dest.Id) ? (object)DBNull.Value : dest.Id;
نصائح أخرى
ال Value
الخاصية من النوع object
, ، لذلك يجب أن يلقي object
, ، ليس string
:
proc.Parameters[PARAM_ID].Value = string.IsNullOrEmpty(dest.Id)
? (object)DBNull.Value
: (object)dest.Id;
أو يمكنك إضافة طريقة تمديد مثل:
public static class DBNullExtensions
{
public static object AsDBNullIfEmpty(this string value)
{
if (String.IsNullOrEmpty(value))
{
return DBNull.Value;
}
return value;
}
}
وبعد ذلك يمكنك أن تقول فقط
proc.Parameters[PARAM_ID].Value = dest.Id.AsDBNullIfEmpty();
(مقتبس من فيل هاك)
قابلة للقراءة والموجزة ، لا؟
ماذا عن استخدام ؟؟ مشغل coalescing فارغ مزيد من التفاصيل حول ؟؟ المشغل أو العامل
proc.Parameters[PARAM_ID].Value = dest.Id ?? (object)DBNull.Value;