سؤال

إذا كان لدي رمز مماثل لما يلي:

while(myDataReader.Read())
{
  myObject.intVal = Convert.ToInt32(myDataReader["mycolumn"] ?? 0);
}

يلقي الخطأ:

لا يمكن أن يلقي الكائن من دبنول إلى أنواع أخرى.

تعريف intVal كما إنت نولابل ليس خيارا.هل هناك طريقة بالنسبة لي أن تفعل ما سبق?

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

المحلول

هل يمكنك استخدام طريقة تمديد؟(شطب قبالة رأس رأسي) giveacodicetagpre.

كنت تستخدمها مثل: giveacodicetagpre.

نصائح أخرى

هنا خيار آخر آخر: giveacodicetagpre.

يمكنك ببساطة استخدام Int32.Tryparse?

int number;
bool result = Int32.TryParse(myDataReader["mycolumn"].ToString(), out number);

وفقا ل مسن, number سوف تحتوي على 0 إذا فشل التحويل

ماذا عن شيء مثل: giveacodicetagpre.

أو في حالتك: giveacodicetagpre.

لماذا لا تستخدم شيئا آخر غير عامل الاندماج الفارغ (DBNull.Value != null):

int i = myDataReader["mycolumn"] == DBNull.Value ?
            Convert.ToInt32(myDataReader["mycolumn"]) :
            0;

هل يمكن دائما التفاف عليه في طريقة تمديد أنيق:

public static T Read<T>(this DataReader reader, string column, T defaultVal)
{
    if(reader[column] == DBNull.Value) return defaultVal;
    return Convert.ChangeType(reader[column], typeof(T));
}

كلا، يعمل فقط ل Nulls.

ماذا عن طريقة التمديد على الكائن الذي يتحقق من DBNull، وإرجاع قيمة افتراضية بدلا من ذلك؟ giveacodicetagpre.

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