एसक्यूएल डेटा रीडर - नल स्तंभ मानों को संभालना


297

मैं एक डेटाबेस से POCOs बनाने के लिए SQLdatareader का उपयोग कर रहा हूं। यह डेटाबेस में एक शून्य मान का सामना करने के अलावा कोड काम करता है। उदाहरण के लिए, यदि डेटाबेस में FirstName कॉलम में शून्य मान है, तो एक अपवाद फेंक दिया गया है।

employee.FirstName = sqlreader.GetString(indexFirstName);

इस स्थिति में अशक्त मूल्यों को संभालने का सबसे अच्छा तरीका क्या है?

जवाबों:


470

आपको इसकी जांच करने की आवश्यकता है IsDBNull:

if(!SqlReader.IsDBNull(indexFirstName))
{
  employee.FirstName = sqlreader.GetString(indexFirstName);
}

इस स्थिति का पता लगाने और उसे संभालने का आपका एकमात्र विश्वसनीय तरीका है।

मैंने उन चीजों को विस्तार के तरीकों में लपेट लिया और यदि कॉलम वास्तव में है तो एक डिफ़ॉल्ट मान वापस करने के लिए करते हैं null:

public static string SafeGetString(this SqlDataReader reader, int colIndex)
{
   if(!reader.IsDBNull(colIndex))
       return reader.GetString(colIndex);
   return string.Empty;
}

अब आप इसे इस तरह कह सकते हैं:

employee.FirstName = SqlReader.SafeGetString(indexFirstName);

और आपको nullफिर से एक अपवाद या मूल्य के बारे में चिंता करने की आवश्यकता नहीं होगी ।


64
यदि किसी को सूचकांक के बजाय स्तंभ नाम की आवश्यकता है , तो आप कर सकते हैं: int colIndex = reader.GetOrdinal(fieldname);और आसानी से @ marc_s SafeGetStringफ़ंक्शन को अधिभारित कर सकते हैं ।
इलान

विश्वास नहीं कर सकता मैं 2019 में यहाँ हूँ, VB में कोई कम .......... धन्यवाद हालांकि, बहुत मदद
जिमी

इस तरह भी किया जा सकता है: int ordinal = reader.GetOrdinal ("col_name"); uint? वैल = रीडर। एसएसडीबीएन (ऑर्डिनल)? (uint?) null: Reader.GetUInt32 (ordinal);
ed22

हैलो दोस्तों! मैंने फॉर्म में कॉपी और पेस्ट करने की कोशिश की और एक त्रुटि के साथ लौटा। "एक्सटेंशन विधि को गैर-सामान्य स्थिर वर्ग में परिभाषित किया जाना चाहिए।"
जिनसेन मलगाय

यदि आप Reader.GetOrindal का उपयोग SafeGetString के अंदर कर रहे हैं और आप SafeGetString का उपयोग लूप के अंदर करना चाहते हैं, तो यह प्रदर्शन हिट के बिना कैसे प्राप्त किया जा सकता है?
AspUser7724

223

आपको डिफ़ॉल्ट मानों के लिए asऑपरेटर के साथ संयुक्त ऑपरेटर का उपयोग करना चाहिए ??। मूल्य प्रकारों को अशक्त के रूप में पढ़ा जाना चाहिए और एक डिफ़ॉल्ट दिया जाना चाहिए।

employee.FirstName = sqlreader[indexFirstName] as string;
employee.Age = sqlreader[indexAge] as int? ?? default(int);

asऑपरेटर DBNull के लिए चेक सहित कास्टिंग संभालती है।


6
यदि कोई आयु कॉलम को SQL बिंटंट (c # long) के इंट से बदलकर बदल देता है, तो आपका कोड 0. वापस करके चुपचाप विफल हो जाएगा। ZXX का उत्तर अधिक विश्वसनीय IMO है।
मार्टिन Martinरडिंग-थॉमसन

मुझे आश्चर्य है कि अगर आप डिफॉल्ट (int) को 0 के बजाय -1
क्रिस

5
@ क्रिस - आपको -1 के साथ डिफ़ॉल्ट (इंट) को बदलने में सक्षम होना चाहिए।
स्टेवेयपवेल

@ Stevo3000 आप सही हैं! मैंने कोशिश की कि यह काम किया और जैसा कि आपने पोस्ट करने के बाद कहा था, लेकिन मैं इस पेज पर वापस आना भूल गया :)
क्रिस

5
ध्यान रखें कि यहाँ "as" का उपयोग करने से इंडेक्स त्रुटियों को छिपाया जा सकता है। यदि आप गलती से उपयोग करते हैं sqlreader[indexAge] as string ?? "", तो आपको हमेशा मिलेगा ""। विचार करें कि क्या आप वास्तव में (int?)sqlreader[indexAge] ?? defaultValueइसके बजाय चाहते हैं, इसलिए यदि आपका एसक्यूएल आपको खराब मूल्यों के बजाय अपवाद मिलता है। @ Stevo3000: डिफ़ॉल्ट (int) 0 है, -1 नहीं। @ क्रिस: सुनिश्चित करें कि आप वास्तव में चाहते हैं एक का उपयोग कर रहे हैं।
me22

30

एक स्ट्रिंग के लिए आप बस ऑब्जेक्ट संस्करण (एरे ऑपरेटर का उपयोग करके एक्सेस) कर सकते हैं और नल के लिए एक नल स्ट्रिंग के साथ हवा कर सकते हैं:

employee.FirstName = (string)sqlreader[indexFirstName];

या

employee.FirstName = sqlreader[indexFirstName] as string;

पूर्णांक के लिए, यदि आप एक अशक्त इंट के लिए जाते हैं, तो आप GetValueOrDefault () का उपयोग कर सकते हैं

employee.Age = (sqlreader[indexAge] as int?).GetValueOrDefault();

या अशक्त-संचालक ऑपरेटर ( ??)।

employee.Age = (sqlreader[indexAge] as int?) ?? 0;

2
स्पष्ट कास्ट, जैसा कि आपके पहले उदाहरण में, काम नहीं करता है। यह उसी त्रुटि को फेंकता है
म्यूसफ़न

@ मूसफ़ान: क्या आपका क्षेत्र वास्तव में एक तार है? यदि नहीं, तो आपको एक अलग त्रुटि मिलेगी। यह काम करता है और ये उदाहरण 1 और 2 (वाक्यविन्यास से अलग) के बीच कोई वास्तविक अंतर नहीं हैं।
कोडिंग हुई

1
@GoneCoding: हाँ यह एक अशक्त स्ट्रिंग है, और यह निश्चित रूप से एक मामला है, जब दूसरा काम करता है तो पहली समस्या होती है। मुझे लगता है कि समस्या यह है कि अशक्त मूल्यों को कैसे संभाला जाता है। के रूप में, वे नहीं हैं null, बल्कि एक DBNull वस्तु है। दो कथनों के बीच का अंतर पहला है अगर यह एक स्ट्रिंग नहीं है, तो विफल हो जाएगा, जबकि दूसरा सिर्फ एक स्ट्रिंग नहीं होने पर शून्य वापस आ जाएगा।
मूसफ़ान

23

IsDbNull(int)आमतौर पर इस तरह के तरीकों का उपयोग करने GetSqlDateTimeऔर फिर तुलना करने की तुलना में बहुत धीमी है DBNull.Value। के लिए इन विस्तार विधियों का प्रयास करें SqlDataReader

public static T Def<T>(this SqlDataReader r, int ord)
{
    var t = r.GetSqlValue(ord);
    if (t == DBNull.Value) return default(T);
    return ((INullable)t).IsNull ? default(T) : (T)t;
}

public static T? Val<T>(this SqlDataReader r, int ord) where T:struct
{
    var t = r.GetSqlValue(ord);
    if (t == DBNull.Value) return null;
    return ((INullable)t).IsNull ? (T?)null : (T)t;
}

public static T Ref<T>(this SqlDataReader r, int ord) where T : class
{
    var t = r.GetSqlValue(ord);
    if (t == DBNull.Value) return null;
    return ((INullable)t).IsNull ? null : (T)t;
}

उनका इस तरह उपयोग करें:

var dd = r.Val<DateTime>(ords[4]);
var ii = r.Def<int>(ords[0]);
int nn = r.Def<int>(ords[0]);

5
मुझे पता चल रहा है कि System.Data.SqlTypes प्रकार के स्पष्ट ऑपरेटर इस कोड का उपयोग करने के लिए हर जगह त्रुटियां फेंक रहे हैं ...
Tetsujin no Oni

यह कभी-कभी विफल क्यों होता है, इसकी व्याख्या के लिए stackoverflow.com/a/21024873/1508467 देखें (SQL int कॉलम पढ़ने के लिए Val <int> का उपयोग करने का प्रयास करें)।
राइस जोन्स

12

इसे करने का एक तरीका है db nulls के लिए जाँच करना:

employee.FirstName = (sqlreader.IsDBNull(indexFirstName) 
    ? ""
    : sqlreader.GetString(indexFirstName));

12

reader.IsDbNull(ColumnIndex) कई उत्तरों के अनुसार काम करता है।

और मैं उल्लेख करना चाहता हूं कि क्या आप स्तंभ नामों के साथ काम कर रहे हैं, तो तुलना के प्रकार अधिक आरामदायक हो सकते हैं।

if(reader["TeacherImage"].GetType() == typeof(DBNull)) { //logic }

यह System.Data और .NET FW के पुराने संस्करणों पर भी काम करता है
RaSor

11

मुझे नहीं लगता कि कोई NULL है स्तंभ मान है, जब पंक्तियों को स्तंभ नाम का उपयोग करके डेटाटैडर में वापस किया जाता है।

यदि आप ऐसा करते हैं तो datareader["columnName"].ToString();यह आपको हमेशा एक मूल्य देगा जो एक खाली स्ट्रिंग हो सकता है (String.Empty यदि आपको तुलना करने की आवश्यकता है)।

मैं निम्नलिखित का उपयोग करूंगा और बहुत अधिक चिंता नहीं करूंगा:

employee.FirstName = sqlreader["columnNameForFirstName"].ToString();

4
आप एक पाठक [फील्डनेम] == DBNull.Value कर सकते हैं, NULL के लिए जाँच करने के लिए
राल्फ विलगॉस

11

यह समाधान कम विक्रेता पर निर्भर है और SQL, OleDB और MySQL रीडर के साथ काम करता है:

public static string GetStringSafe(this IDataReader reader, int colIndex)
{
    return GetStringSafe(reader, colIndex, string.Empty);
}

public static string GetStringSafe(this IDataReader reader, int colIndex, string defaultValue)
{
    if (!reader.IsDBNull(colIndex))
        return reader.GetString(colIndex);
    else
        return defaultValue;
}

public static string GetStringSafe(this IDataReader reader, string indexName)
{
    return GetStringSafe(reader, reader.GetOrdinal(indexName));
}

public static string GetStringSafe(this IDataReader reader, string indexName, string defaultValue)
{
    return GetStringSafe(reader, reader.GetOrdinal(indexName), defaultValue);
}

1
इस कोड को सीधे एक एक्सटेंशन क्लास में कॉपी और कस्टमाइज़ करना।
qxotk

8

मैं जो कुछ भी करना चाहता हूं, वह कुछ उचित के साथ चयन कथन में शून्य मानों को बदल देता है।

SELECT ISNULL(firstname, '') FROM people

यहां मैं प्रत्येक नल को एक रिक्त स्ट्रिंग के साथ बदल देता हूं। उस स्थिति में आपका कोड गलती से नहीं फेंकेगा।


यदि संभव हो, तो इसे नल से बचें। अन्यथा, मुझे सनी बॉय का हेल्पर तरीकों का जवाब पसंद है।
नो रिफंड्स नो रिटर्न

3
एक स्थिर, अलग सहायक विधि क्यों? SqlDataReader पर एक विस्तार विधि अधिक सम्मोहक और अधिक सहज नहीं लगती है ??
marc_s

7

नल की जाँच करने के लिए आप एक सामान्य फ़ंक्शन लिख सकते हैं और जब यह शून्य होता है तो डिफ़ॉल्ट मान शामिल करता है। डेटाएडर पढ़ते समय इसे कॉल करें

public T CheckNull<T>(object obj)
        {
            return (obj == DBNull.Value ? default(T) : (T)obj);
        }

जब डाएट्रेडर का उपयोग पढ़ते हैं

                        while (dr.Read())
                        {
                            tblBPN_InTrRecon Bpn = new tblBPN_InTrRecon();
                            Bpn.BPN_Date = CheckNull<DateTime?>(dr["BPN_Date"]);
                            Bpn.Cust_Backorder_Qty = CheckNull<int?>(dr["Cust_Backorder_Qty"]);
                            Bpn.Cust_Min = CheckNull<int?>(dr["Cust_Min"]);
                         }

6

sqlreader.IsDBNull(indexFirstName)इसे पढ़ने का प्रयास करने से पहले जांच लें।


4

सहायक तरीके बनाने के बारे में कैसे

स्ट्रिंग के लिए

private static string MyStringConverter(object o)
    {
        if (o == DBNull.Value || o == null)
            return "";

        return o.ToString();
    }

प्रयोग

MyStringConverter(read["indexStringValue"])

Int के लिए

 private static int MyIntonverter(object o)
    {
        if (o == DBNull.Value || o == null)
            return 0;

        return Convert.ToInt32(o);
    }

प्रयोग

MyIntonverter(read["indexIntValue"])

दिनांक के लिए

private static DateTime? MyDateConverter(object o)
    {
        return (o == DBNull.Value || o == null) ? (DateTime?)null : Convert.ToDateTime(o);
    }

प्रयोग

MyDateConverter(read["indexDateValue"])

नोट: DateTime के लिए varialbe घोषित करें

DateTime? variable;

4

Marc_s द्वारा उत्तर के अतिरिक्त, आप SqlDataReader से मान प्राप्त करने के लिए एक अधिक सामान्य एक्सटेंशन विधि का उपयोग कर सकते हैं:

public static T SafeGet<T>(this SqlDataReader reader, int col)
    {
        return reader.IsDBNull(col) ? default(T) : reader.GetFieldValue<T>(col);
    }

मैं इस विधि को "सेफगेट" नहीं कहूंगा क्योंकि अगर टी एक संरचना है तो यह नल को टी के लिए गैर-शून्य डिफ़ॉल्ट में बदल देगा - वास्तव में सुरक्षित नहीं। शायद "GetValueOrDefault"।
राइस जोन्स

@RhysJones इस मामले में आपके पास एक संरचना के रूप में टी क्यों होगा? यहां तक ​​कि अगर आप करते हैं तो मैं तर्क दूंगा कि संरचना में गैर-शून्य डिफ़ॉल्ट अपेक्षित व्यवहार है।
जुप

@RhysJones लेकिन मैं मानता हूं कि यह विधि सुरक्षित नहीं हो सकती है, इसे SqlDataReader से InvalidCastException जैसे अपवादों को संभालने की आवश्यकता होगी।
उठे

4

गेट्सपीच्ड के उत्तर से प्रभावित होकर , मैंने एक सामान्य विधि बनाई, जो इसके नाम से कॉलम मान की जांच करती है

public static T SafeGet<T>(this System.Data.SqlClient.SqlDataReader reader, string nameOfColumn)
{
  var indexOfColumn = reader.GetOrdinal(nameOfColumn);
  return reader.IsDBNull(indexOfColumn) ? default(T) : reader.GetFieldValue<T>(indexOfColumn);
}

उपयोग:

var myVariable = SafeGet<string>(reader, "NameOfColumn")

मैं नहीं जानता कि आप कौन हैं, लेकिन आपको आशीर्वाद देते हैं। यह कार्य तीन घंटे से अधिक समय तक बचा रहा।
रामनेक सिंह

3

मुझे लगता है कि आप उपयोग करना चाहेंगे:

SqlReader.IsDBNull(indexFirstName)

2

हम अपने डेटा पाठकों में से सभी मानों को खींचने के लिए स्थिर तरीकों की एक श्रृंखला का उपयोग करते हैं। तो इस मामले में हम बुला रहे हैंDBUtils.GetString(sqlreader(indexFirstName)) स्थैतिक / साझा तरीकों को बनाने का लाभ यह है कि आपको एक ही चेक को बार-बार नहीं करना है ...

स्थैतिक विधि (ओं) में नलियों की जांच करने के लिए कोड होगा (इस पृष्ठ पर अन्य उत्तर देखें)।


2

आप सशर्त ऑपरेटर का उपयोग कर सकते हैं:

employee.FirstName = sqlreader["indexFirstName"] != DBNull.Value ? sqlreader[indexFirstName].ToString() : "";

नीचे दिए गए उत्तर में से एक के रूप में ही, लेकिन 8 साल पीछे!
बीयरोलीन

2

उपयोगी जानकारी (और कुछ गलत जानकारी) के बारे में यहाँ बहुत सारे उत्तर हैं, मैं इसके बारे में सबको साथ लाना चाहता हूँ।

प्रश्न का संक्षिप्त उत्तर DBNull के लिए जाँचना है - लगभग सभी इस बात पर सहमत हैं :)

SQL डेटा प्रति अशक्त मूल्यों को पढ़ने के लिए एक सहायक विधि का उपयोग करने के बजाय एक सामान्य विधि हमें एक बहुत कम कोड के साथ यह पता करने की अनुमति देती है। हालाँकि, आपके पास अशक्त मूल्य प्रकार और संदर्भ प्रकार दोनों के लिए एक ही सामान्य विधि नहीं हो सकती है, यह एक सामान्य पैरामीटर के रूप में Nullable प्रकार की लंबाई पर चर्चा की जाती है? और अशक्त सब कुछ के लिए सी # सामान्य प्रकार की बाधा

इसलिए, @ZXX और @getpsyched के जवाबों के बाद हम इसे समाप्त करते हैं, अशक्त मूल्यों को प्राप्त करने के 2 तरीके और मैंने गैर-शून्य मानों के लिए एक तीसरा जोड़ा है (यह विधि के नामकरण के आधार पर सेट को पूरा करता है)।

public static T? GetNullableValueType<T>(this SqlDataReader sqlDataReader, string columnName) where T : struct
{
    int columnOrdinal = sqlDataReader.GetOrdinal(columnName);
    return sqlDataReader.IsDBNull(columnOrdinal) ? (T?)null : sqlDataReader.GetFieldValue<T>(columnOrdinal);
}

public static T GetNullableReferenceType<T>(this SqlDataReader sqlDataReader, string columnName) where T : class
{
    int columnOrdinal = sqlDataReader.GetOrdinal(columnName);
    return sqlDataReader.IsDBNull(columnOrdinal) ? null : sqlDataReader.GetFieldValue<T>(columnOrdinal);
}

public static T GetNonNullValue<T>(this SqlDataReader sqlDataReader, string columnName)
{
    int columnOrdinal = sqlDataReader.GetOrdinal(columnName);
    return sqlDataReader.GetFieldValue<T>(columnOrdinal);
}

मैं आमतौर पर कॉलम नामों का उपयोग करता हूं, यदि आप कॉलम इंडेक्स का उपयोग करते हैं तो इन्हें बदल दें। इन विधियों के नाम के आधार पर मैं बता सकता हूं कि क्या मैं डेटा के अशक्त होने की उम्मीद कर रहा हूं या नहीं, काफी पहले लिखे गए कोड को देखकर काफी उपयोगी है।

युक्तियाँ;

  • डेटाबेस में अशक्त स्तंभ नहीं होने से इस समस्या से बचा जाता है। यदि आपके पास डेटाबेस पर नियंत्रण है, तो कॉलम डिफ़ॉल्ट रूप से गैर-अशक्त होना चाहिए और जहां आवश्यक हो, केवल अशक्त होना चाहिए।
  • डेटाबेस मानों को C # 'ऑपरेटर' के रूप में न लें क्योंकि यदि कास्ट गलत है तो यह चुपचाप अशक्त हो जाएगा।
  • डिफ़ॉल्ट मान अभिव्यक्ति का उपयोग करने से डेटाबेस नल को मान प्रकार, डेटाटाइम, बिट आदि जैसे मानों के लिए गैर-शून्य मानों में बदल जाएगा।

अंत में, सभी एसक्यूएल सर्वर डेटा प्रकारों में उपरोक्त तरीकों का परीक्षण करते समय मैंने पाया कि आप सीधे एसक्लाडेटर से एक चार [] नहीं पा सकते हैं, यदि आप एक चार [] चाहते हैं तो आपको एक स्ट्रिंग प्राप्त करना होगा और ToCharArray () का उपयोग करना होगा।


1

मैं एक एक्सेल शीट में अशक्त कोशिकाओं को संभालने के लिए नीचे सूचीबद्ध कोड का उपयोग कर रहा हूं जो एक डिटैटेबल को पढ़ा जाता है।

if (!reader.IsDBNull(2))
{
   row["Oracle"] = (string)reader[2];
}

1
private static void Render(IList<ListData> list, IDataReader reader)
        {
            while (reader.Read())
            {

                listData.DownUrl = (reader.GetSchemaTable().Columns["DownUrl"] != null) ? Convert.ToString(reader["DownUrl"]) : null;
                //没有这一列时,让其等于null
                list.Add(listData);
            }
            reader.Close();
        }

1

और / या असाइनमेंट के साथ टर्नरी ऑपरेटर का उपयोग करें:

employee.FirstName = rdr.IsDBNull(indexFirstName))? 
                     String.Empty: rdr.GetString(indexFirstName);

प्रत्येक प्रॉपर्टी के प्रकार के लिए डिफ़ॉल्ट (जब शून्य) मान को बदलें ...


1

यह विधि इंडेक्सफर्स्टनाम पर निर्भर है जो शून्य-आधारित कॉलम ऑर्डिनल होना चाहिए।

if(!sqlReader.IsDBNull(indexFirstName))
{
  employee.FirstName = sqlreader.GetString(indexFirstName);
}

यदि आप कॉलम इंडेक्स को नहीं जानते हैं, लेकिन एक नाम की जांच करना नहीं चाहते हैं तो आप इस एक्सटेंशन विधि का उपयोग कर सकते हैं:

public static class DataRecordExtensions
{
    public static bool HasColumn(this IDataRecord dr, string columnName)
    {
        for (int i=0; i < dr.FieldCount; i++)
        {
            if (dr.GetName(i).Equals(columnName, StringComparison.InvariantCultureIgnoreCase))
                return true;
        }
        return false;
    }
}

और इस तरह विधि का उपयोग करें:

if(sqlReader.HasColumn("FirstName"))
{
  employee.FirstName = sqlreader["FirstName"];
}

1

पुराना सवाल है लेकिन शायद किसी को अभी भी जवाब की जरूरत है

वास्तव में मैं इस मुद्दे पर इस तरह के आसपास काम किया

उदाहरण के लिए:

public static object GatDataInt(string Query, string Column)
    {
        SqlConnection DBConn = new SqlConnection(ConnectionString);
        if (DBConn.State == ConnectionState.Closed)
            DBConn.Open();
        SqlCommand CMD = new SqlCommand(Query, DBConn);
        SqlDataReader RDR = CMD.ExecuteReader();
        if (RDR.Read())
        {
            var Result = RDR[Column];
            RDR.Close();
            DBConn.Close();
            return Result;
        }
        return 0;
    }

स्ट्रिंग के लिए वही, "0 के बजाय" "" खाली स्ट्रिंग है

तो आप इसे उपयोग कर सकते हैं

int TotalPoints = GatDataInt(QueryToGetTotalPoints, TotalPointColumn) as int?;

तथा

string Email = GatDatastring(QueryToGetEmail, EmailColumn) as string;

बहुत लचीला तो आप किसी भी कॉलम को पढ़ने के लिए किसी भी क्वेरी को सम्मिलित कर सकते हैं और यह कभी भी त्रुटि के साथ वापस नहीं आएगा


0

यहाँ सहायक वर्ग है, जो अन्य उपयोग कर सकते हैं, अगर उन्हें @marc_s उत्तर के आधार पर आवश्यकता हो:

public static class SQLDataReaderExtensions
    {
        public static int SafeGetInt(this SqlDataReader dataReader, string fieldName)
        {
            int fieldIndex = dataReader.GetOrdinal(fieldName);
            return dataReader.IsDBNull(fieldIndex) ? 0 : dataReader.GetInt32(fieldIndex);
        }

        public static int? SafeGetNullableInt(this SqlDataReader dataReader, string fieldName)
        {
            int fieldIndex = dataReader.GetOrdinal(fieldName);
            return dataReader.GetValue(fieldIndex) as int?;
        }

        public static string SafeGetString(this SqlDataReader dataReader, string fieldName)
        {
            int fieldIndex = dataReader.GetOrdinal(fieldName);
            return dataReader.IsDBNull(fieldIndex) ? string.Empty : dataReader.GetString(fieldIndex);
        }

        public static DateTime? SafeGetNullableDateTime(this SqlDataReader dataReader, string fieldName)
        {
            int fieldIndex = dataReader.GetOrdinal(fieldName);
            return dataReader.GetValue(fieldIndex) as DateTime?;
        }

        public static bool SafeGetBoolean(this SqlDataReader dataReader, string fieldName)
        {
            return SafeGetBoolean(dataReader, fieldName, false);
        }

        public static bool SafeGetBoolean(this SqlDataReader dataReader, string fieldName, bool defaultValue)
        {
            int fieldIndex = dataReader.GetOrdinal(fieldName);
            return dataReader.IsDBNull(fieldIndex) ? defaultValue : dataReader.GetBoolean(fieldIndex);
        }
    }

0

कन्वर्ट DbNull को समझदारी से हैंडल करें।

employee.FirstName = Convert.ToString(sqlreader.GetValue(indexFirstName));

ध्यान दें कि DBNull रिक्त स्ट्रिंग में परिवर्तित होता है, शून्य मान नहीं।
Rhys जोन्स

-2

आप कभी भी इसके लिए जाँच कर सकते हैं

if(null !=x && x.HasRows)
{ ....}

-1 यह बात नहीं है: हम एक अशक्त स्तंभ मान के मामले को संभाल रहे हैं, न कि अशक्त या रिक्त के रूप मेंSqlDataReader
ब्लूश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.