سؤال

لقد حددت الفصل شخص منشأه عيد الميلاد مثل لاغية الوقت؟ ، فلماذا لا ينبغي أن يعمل مشغل الفحم الفارغ في المثال التالي؟

cmd.Parameters.Add(new SqlParameter("@Birthday",
   SqlDbType.SmallDateTime)).Value =       
     person.Birthday ?? DBNull.Value; 

كان المترجم الذي حصلت عليه "عامل" ؟؟ " لا يمكن تطبيقها على المعاملات من النوع "system.dateTime؟" و "system.dbnull" "

فيما يلي أيضًا خطأ في التجميع:

cmd.Parameters.Add(new SqlParameter("@Birthday", 
  SqlDbType.SmallDateTime)).Value = 
   (person.Birthday == null) ? person.Birthday:DBNull.Value;

لقد أضفت فريقًا إلى (كائن) كما أوصت به Refactor ، وقد تم تجميعه ، لكن لم يعمل بشكل صحيح وتم تخزين القيمة في SQLServer DB كخلفي في كلتا الحالتين.

SqlDbType.SmallDateTime)).Value =       
         person.Birthday ?? (object)DBNull.Value;

هل يمكن لأحد أن يشرح ما يجري هنا؟

كنت بحاجة لاستخدام الرمز الخرقاء التالي:

   if (person.Birthday == null) 
    cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value 
      = DBNull.Value;
     else cmd.Parameters.Add("@Birthday", SqlDbType.SmallDateTime).Value = 
          person.Birthday;
هل كانت مفيدة؟

المحلول

المشكلة هي DateTime? و DBNull.Value ليست نفس النوع ، لذا لا يمكنك استخدام مشغل الفحم الخالي عليها.

في حالتك يمكنك القيام بها person.Birthday ?? (object)DBNull.Value لتمرير قيمة النوع object من خلال ل Add()

نصائح أخرى

أفضل التكرار على المعلمات الخاصة بي قبل تنفيذ الاستعلام ، وتغيير جميع حالات NULL إلى DBNULL حسب الاقتضاء ، على سبيل المثال:

foreach (IDataParameter param in cmd.Parameters)
    if (param.Value == null)
        param.Value = DBNull.Value;

هذا يتيح لي أن أترك القيم الخالية كما هو-وببساطة تبادلها بشكل جماعي في وقت لاحق.

مشكلتك الأولى هي ذلك ل ?? أو ?: المشغل ، يجب أن تكون الكائنات لأي من الاختيار هي نفس النوع. هنا نوع مختلف.

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