ما هي أفضل الممارسات للتعامل مع null الباحث/شار من SQL قاعدة البيانات ؟

StackOverflow https://stackoverflow.com/questions/318567

  •  11-07-2019
  •  | 
  •  

سؤال

لدي قاعدة بيانات عقد هذا المستخدم اختياري الشخصي.في الملف الشخصي لدي سلاسل, char (ل م أو و) و رجات.

أنا واجهت مشكلة حيث كنت في محاولة لوضع جنس المستخدم في الممتلكات من ملفي الشخصي الكائن تعطل التطبيق لأنه لا يعرف كيفية التعامل مع إرجاع قيمة خالية.

لقد حاولت صب البيانات إلى النوع المناسب

char sex = (char)dt.Rows[0]["Sex"];

الذي لم يحل مشكلتي.ثم حاول تغيير أنواع Nullable و Nullable والحصول على تحويل القضايا كل نفس.بلدي الحل الحالي أن كنت قادرا على العثور على ما يلي:

object.sex = null;  
if(dt.Rows[0]["Sex"] != DBNull.Value)
      object.sex = (char)dt.Rows[0]["Sex"];
object.WorkExt = null;
if(dt.Rows[0]["WorkExt"] != DBNull.Value)
      object.WorkExt = (int)dt.Rows[0]["WorkExt"];

هل هناك أسهل أو أفضل طريقة للقيام بذلك ؟ أو أنا الى حد كبير على المسار الصحيح ؟

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

المحلول

والجواب rotard في (استخدام Is<ColumnName>Null()) يعمل فقط لمجموعات البيانات المكتوبة.

لمجموعات البيانات مصنف، لديك لاستخدام واحد من أنماط في التعليمة البرمجية التالية. إذا هذا الرمز ليست نهائية، واسمحوا لي أن أعرف وأنا سوف تحريره حتى هو. هذا هو السؤال شائع جدا أن يكون هناك حقا واحدة فقط الإجابة الصحيحة.

using System.
using System.Data;

class Program
{
    static void Main(string[] args)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("test", typeof (char));
        dt.Columns["test"].AllowDBNull = true;

        DataRow dr = dt.Rows.Add();
        char? test;

        try
        {
            test = (char?)dr["test"];
        }
        catch (InvalidCastException)
        {
            Console.WriteLine("Simply casting to a nullable type doesn't work.");
        }

        test  = dr.Field<char?>("test");
        if (test == null)
        {
            Console.WriteLine("The Field extension method in .NET 3.5 converts System.DBNull to null.");                
        }

        test = (dr["test"] is DBNull) ? null : (char?) dr["test"];
        if (test == null)
        {
            Console.WriteLine("Before .NET 3.5, you have to check the type of the column's value.");
        }

        test = (dr["test"] == DBNull.Value) ? null : (char?) dr["test"];
        if (test == null)
        {
            Console.WriteLine("Comparing the field's value to DBNull.Value is very marginally faster, but takes a bit more code.");
        }

        // now let's put the data back

        try
        {
            dr["test"] = test;
        }
        catch (ArgumentException)
        {
            Console.WriteLine("You can't set nullable columns to null.");
        }

        dr.SetField("test", test);
        if (dr["test"] is DBNull)
        {
            Console.WriteLine("Again, in .NET 3.5 extension methods make this relatively easy.");
        }

        dr["test"] = (object)test ?? DBNull.Value;
        if (dr["test"] is DBNull)
        {
            Console.WriteLine("Before .NET 3.5, you can use the null coalescing operator, but note the awful cast required.");
        }


        Console.ReadLine();
    }
}

نصائح أخرى

وصممت أنواع nullable فقط لهذا الغرض! استخدام "كما شار؟ بدلا من '(شار؟)'

class Foo {
    char? sex;
}
Foo object;

object.sex = dt.Rows[0]["Sex"] as char?;

ومناقشة لائق على ذلك هي في <لأ href = "https://stackoverflow.com/questions/221582/most-efficient-way-to-check-for-dbnull-and-then-assign-to-a -variable "> أنجع وسيلة للتحقق من DBNULL ثم تعيين إلى متغير؟ .

هل دينارا جدول البيانات ADO.Net 2؟ لا يمكنك فعل شيء مثل:

if(dt.Rows[0].IsSexNull()) {} else {}

و؟ أيضا، على افتراض لديك السيطرة على قاعدة البيانات الخاصة بك، فإنه لن يكون أكثر منطقية لاستخدام بعض الشيء، بدلا من سلسلة؟

وماذا عن:

    internal static T CastTo<T>(object value)
    {
        return value != DBNull.Value ? (T)value : default(T);
    }

ومن ثم استخدامها مثل:

        return new EquipmentDetails(
            CastTo<int>(reader["ID"]),
            CastTo<int>(reader["CategoryID"]),
            CastTo<string>(reader["Description"]));

وغيرها ...

وأود أن تفعل ذلك كثيرا جدا كما فعلت.أود أن أكتب دالة على ذلك:

شيء لا:

object.sex = handle(dt.Rows[0]["Sex"]);

و في التعامل مع تفعل ==DBNull.قيمة الشيك.

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