سؤال

يبدو أن هناك نوعًا من الارتباك في المشغل الثلاثية. أعلم أن هذا قد تمت معالجته في خيوط أخرى ، لكنه كان دائمًا مع 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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top