2011-04-14 14 views
7

क्या कोई तरीका है कि मैं .NET में निर्धारित कर सकता हूं, किसी भी मनमानी SQL सर्वर परिणाम सेट के लिए, यदि परिणाम में दिए गए कॉलम में नल हो सकते हैं?SqlDataReader पता लगाता है कि कोई डेटा फ़ील्ड शून्य है

उदाहरण के लिए

, अगर मैं बयान

Select NullableColumn From MyTable 

और

Select IsNull(NullableColumn, '5') as NotNullColumn From MyTable 

है और मैं इस तरह की एक DataReader मिलती है:

var cmd = new SqlCommand(statement, connection); 
var rdr = cmd.ExecuteReader(); 

मैं इस तरह एक समारोह हो सकता है?

bool ColumnMayHaveNullData(SqlDataReader rdr, int ordinal) 
{ 
    //???? 
} 

मैं चाहता हूं कि यह पहले कथन के लिए सच हो और दूसरे कथन के लिए गलत हो।

rdr.GetSchemaTable() इसके लिए काम नहीं करता है क्योंकि यह लौटाता है कि अंतर्निहित कॉलम शून्य हो सकता है, जो मैं नहीं चाहता हूं। वहाँ DataReader पर कार्यों .. कि क्षेत्र की अंतर्निहित एसक्यूएल प्रकार वापसी, लेकिन कोई भी मुझे बताओ अगर यह अशक्त हो सकता है लग रहे हैं

+1

क्या मैं पूछ सकता हूं कि आप क्यों जानना चाहते हैं? – tomfanning

+0

@tomfanning मैं एक ओआरएम हैकिंग कर रहा हूँ। मैं किसी भी समय लॉग इन करना चाहता हूं जब कोई कोई क्वेरी चलाने की कोशिश करता है जहां एक शून्य-डीबी फ़ील्ड मैप गैर-शून्य मूल्य प्रकार के लिए होता है। – dan

उत्तर

1

दुर्भाग्यवश आप ऐसा नहीं कर सकते क्योंकि SQL सर्वर का यह निर्धारित करने का कोई तरीका नहीं है कि कोई फ़ील्ड शून्य है या नहीं। आप परिणाम सेट (ऑपरेटरों, फ़ंक्शन कॉल इत्यादि) में फ़ील्ड पर मध्यस्थ परिवर्तन कर सकते हैं और उन परिवर्तनों में उनके बारे में मेटाडेटा नहीं है कि वे शून्य को वापस कर सकते हैं या नहीं कर सकते हैं। तो आपको मैन्युअल रूप से इसे समझना होगा या schemabinding के साथ विचारों का उपयोग करना होगा ...

1

मैं थोड़ा उलझन में हूँ:

"इस के लिए काम नहीं करता है क्योंकि यह रिटर्न अंतर्निहित स्तंभ अशक्त हो सकता है कि क्या है, जो है कि मैं क्या नहीं चाहते हैं। "

" लेकिन कोई भी मुझे बताओ अगर यह अशक्त हो सकता है लगता है .. "

आप अंतर्निहित तालिका क्वेरी को देखने के लिए कर सकते हैं यदि कोई कॉलम शून्य-सक्षम है (मान लीजिए कि आप यही चाहते हैं)।

SELECT IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'MyTable' AND COLUMN_NAME = 'MyColumn' 
+0

मैं जानना चाहता हूं कि परिणाम सेट में एक कॉलम में नल हो सकते हैं, न कि अंतर्निहित तालिका में कॉलम में नल हो सकते हैं। मेरे उदाहरण में, मैं नल मानों को गैर-शून्य मानों में बदलने के लिए चयन कथन में एक IsNull() का उपयोग करता हूं। इस मामले में, परिणामस्वरूप सेट कॉलम में नल शामिल नहीं हो सकते हैं, भले ही अंतर्निहित तालिका कॉलम हो। – dan

+0

परिणाम सेट कॉलम में अभी भी नल शामिल हो सकते हैं, लेकिन आपने सभी नल को गैर नल के साथ बदल दिया है। तो आप जानना चाहते हैं कि डेटा 'साफ़' था या नहीं? आप दो बार एक ही कॉलम पुनर्प्राप्त कर सकते हैं ... एक नल के साथ कच्चा होगा और दूसरा एक ही कॉलम का स्क्रब संस्करण होगा। –

+0

यदि मैंने सभी नल को गैर नल के साथ बदल दिया है, तो परिणाम सेट कॉलम में नल शामिल नहीं हैं। यही वह है जिसे मैं ढूंढने की कोशिश कर रहा हूं, लेकिन अलग-अलग मूल्यों को देखने के लिए पंक्तियों के माध्यम से लूप किए बिना। असल में मैं रनटाइम पर किसी ऑब्जेक्ट मॉडल के विरुद्ध विज्ञापन-प्रसार क्वेरी को सत्यापित करने का प्रयास कर रहा हूं। आप और मैं केवल एक क्वेरी को देखकर बता सकता हूं जिसके परिणामस्वरूप कॉलम में नल हो सकते हैं, इसलिए उस फ़ंक्शन को लिखने का एक तरीका होना चाहिए जो इसे समझ सके। – dan

संबंधित मुद्दे