ج# ؟؟ سؤال مشغل الفحم الخالي
-
26-09-2019 - |
سؤال
لقد حددت الفصل شخص منشأه عيد الميلاد مثل لاغية الوقت؟ ، فلماذا لا ينبغي أن يعمل مشغل الفحم الفارغ في المثال التالي؟
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;
هذا يتيح لي أن أترك القيم الخالية كما هو-وببساطة تبادلها بشكل جماعي في وقت لاحق.
مشكلتك الأولى هي ذلك ل ??
أو ?:
المشغل ، يجب أن تكون الكائنات لأي من الاختيار هي نفس النوع. هنا نوع مختلف.