سؤال

(LocalVariable) ABC.String (name) = (IdatAreader) dataReader.getString (0) ؛

تأتي قيمة الاسم هذه من قاعدة البيانات .. ما الذي يحدث هنا هو إذا كانت قيمة الاسم هذه خالية أثناء قراءة استثناءها؟

أنا أفعل بعضًا يدويًا إذا كان الشرط هنا. لا أريد أن أكتب حالة يدوية للتحقق من جميع متغيراتي ..

أنا أفعل شيئًا كهذا الآن ..

string abc =  (Idatareader)datareader.GetValue(0);
if(abc = null)
    //assiging null
else
    assiging abc value

هل هناك شيء مثل هل يمكننا كتابة طريقة تمديد لهذا؟ شكرًا

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

المحلول

فيما يلي طرق تمديد زوجين من شأنها أن تختتم كل مخاوفك حول استرداد القيم المكتوبة بقوة من قارئ البيانات. إذا كانت القيمة dbnull ، فسيتم إرجاع الافتراضي للنوع. في حالة string وهو فئة ، أ null سيتم إرجاع. إذا كان الحقل كان int, ، من ثم 0 سيتم إرجاعها. بالإضافة إلى ذلك ، إذا كنت تتوقع int?, ، قل من حقل INT باطل null سيتم إرجاعها.

استخدام محدد لحالة كومار:

string abc = datareader.GetValueOrDefault<string>(0);

الاستخدام العام

var name = GetValueOrDefault<string>(reader, "Name");

أو

var name = reader.GetValueOrDefault<string>("Name");

أو

var name = reader.GetValueOrDefault<string>(0);

تمديد

public static class NullSafeGetter
{
   public static T GetValueOrDefault<T>(this IDataRecord row, string fieldName)
   {
       int ordinal = row.GetOrdinal(fieldName);
       return row.GetValueOrDefault<T>(ordinal);
   }

   public static T GetValueOrDefault<T>(this IDataRecord row, int ordinal)
   {
       return (T)(row.IsDBNull(ordinal) ? default(T) : row.GetValue(ordinal));
   }
}

من عند http://skysanders.net/subtext/archive/2010/03/02/generic-nullsafe-idatarecord-field-getter.aspx

نصائح أخرى

على غرار الإجابة @Sky-Sanders ولكنها أقل صرامة مع التحويلات:

public static T Get<T>(this IDataRecord row, string fieldName)
{
    int ordinal = row.GetOrdinal(fieldName);
    return row.Get<T>(ordinal);
}

public static T Get<T>(this IDataRecord row, int ordinal)
{
    var value = row.IsDBNull(ordinal) ? default(T) : row.GetValue(ordinal);
    return (T)Convert.ChangeType(value, typeof(T));
}

الحل الخاص بي هو:

private static T GetValue<T>(object o) {
    if (typeof(DBNull) != o.GetType()) {
        return (T) o;
    }
    return default(T);
}

متى، Status = GetValue<string>(currentDataRow["status"])

الجمع بين أفضل الحلول والاقتراحات ، هنا هو C# 6 تعبير السهم نسخة بدعم ل GetValue<T> و GetValueOrDefault<T> مع معلمات القيمة الافتراضية الاختيارية.

public static class DataRecordExtensions {
    /// <summary>
    /// Generically extracts a field value by name from any IDataRecord as specified type. Will throw if DNE.
    /// </summary>
    public static T GetValue<T>(this IDataRecord row, string fieldName)
        => row.GetValue<T>(row.GetOrdinal(fieldName));

    /// <summary>
    /// Generically extracts a field value by ordinal from any IDataRecord as specified type. Will throw if DNE.
    /// </summary>
    public static T GetValue<T>(this IDataRecord row, int ordinal)
        => (T)row.GetValue(ordinal);

    /// <summary>
    /// Generically extracts a field value by name from any IDataRecord as specified type. Will return default generic types value if DNE.
    /// </summary>
    public static T GetValueOrDefault<T>(this IDataRecord row, string fieldName, T defaultValue = default(T))
        => row.GetValueOrDefault<T>(row.GetOrdinal(fieldName), defaultValue);

    /// <summary>
    /// Generically extracts a field value by ordinal from any IDataRecord as specified type. Will return default generic types value if DNE.
    /// </summary>
    public static T GetValueOrDefault<T>(this IDataRecord row, int ordinal, T defaultValue = default(T))
        => (T)(row.IsDBNull(ordinal) ? defaultValue : row.GetValue(ordinal));
}

سأستخدم شيئًا كهذا:

string abc = (IDataReader)datareader.GetValue(0) ?? "Default";
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top