उपयोगी जानकारी (और कुछ गलत जानकारी) के बारे में यहाँ बहुत सारे उत्तर हैं, मैं इसके बारे में सबको साथ लाना चाहता हूँ।
प्रश्न का संक्षिप्त उत्तर 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 () का उपयोग करना होगा।
int colIndex = reader.GetOrdinal(fieldname);
और आसानी से @ marc_sSafeGetString
फ़ंक्शन को अधिभारित कर सकते हैं ।