एक निश्चित क्षेत्र में शामिल है तो मैं कुछ व्यापार वस्तुओं हाइड्रेट करने के लिए एक IDataReader उपयोग कर रहा हूँ, लेकिन मैं क्रम में वास्तव में क्या क्षेत्रों पाठक में हो जाएगा पता नहीं है। कोई भी फ़ील्ड जो पाठक में नहीं है परिणामी वस्तु पर शून्य हो जाएगी। यदि आप किसी पाठक को किसी विशेष फ़ील्ड को किसी कोशिश/पकड़ में लपेटने के बिना एक विशिष्ट फ़ील्ड रखते हैं तो आप कैसे परीक्षण करते हैं?का पता लगा रहा है, तो एक IDataReader से पहले यात्रा
उत्तर
आप नल या डीबीएनयूएल के लिए केवल पाठक ["फ़ील्ड"] का परीक्षण नहीं कर सकते हैं क्योंकि कॉलम पाठक में नहीं है तो indexOutOfRangeException फेंक दिया जाता है।
कोड मैं डोमेन वस्तुओं और संग्रहित प्रक्रियाओं कि मानचित्रण परत का उपयोग अलग स्तंभ नाम हो सकता है बनाने के लिए मेरे मानचित्रण परत में उपयोग के नीचे है; यदि कॉलम नहीं मिला है और डिफ़ॉल्ट (टी) या शून्य वापस लौटाता है तो आप इसे अपवाद फेंकने के लिए संशोधित कर सकते हैं।
मैं समझता हूँ कि यह सबसे खूबसूरत या सर्वोत्कृष्ट समाधान नहीं है (और वास्तव में, यदि आप इसे तो आपको चाहिए बच सकते हैं), हालांकि, विरासत संग्रहित प्रक्रियाओं या SQL क्वेरी एक काम के आसपास वारंट सकता है।
/// <summary>
/// Grabs the value from a specific datareader for a list of column names.
/// </summary>
/// <typeparam name="T">Type of the value.</typeparam>
/// <param name="reader">Reader to grab data off of.</param>
/// <param name="columnNames">Column names that should be interrogated.</param>
/// <returns>Value from the first correct column name or an exception if none of the columns exist.</returns>
public static T GetColumnValue<T>(IDataReader reader, params string[] columnNames)
{
bool foundValue = false;
T value = default(T);
IndexOutOfRangeException lastException = null;
foreach (string columnName in columnNames)
{
try
{
int ordinal = reader.GetOrdinal(columnName);
value = (T)reader.GetValue(ordinal);
foundValue = true;
}
catch (IndexOutOfRangeException ex)
{
lastException = ex;
}
}
if (!foundValue)
{
string message = string.Format("Column(s) {0} could not be not found.",
string.Join(", ", columnNames));
throw new IndexOutOfRangeException(message, lastException);
}
return value;
}
मैं इस दृष्टिकोण (मुझे लगता है कि जब डेटा तक पहुँचने, तो आप पहले से आकार पता होना चाहिए) से असहमत है, मैं समझता हूँ कि अपवाद देखते हैं कि।
तुम हमेशा पाठक के साथ एक datatable लोड कर सकता है और फिर इसे माध्यम से पुनरावृति। फिर आप यह देखने के लिए जांच सकते हैं कि कॉलम मौजूद है या नहीं। यह कम प्रदर्शनकारी होगा, लेकिन आपको कोशिश/पकड़ने वाले ब्लॉक की आवश्यकता नहीं होगी (इसलिए शायद यह आपकी आवश्यकताओं के लिए अधिक सक्षम है)।
इस चाल करना चाहिए:
Public Shared Function ReaderContainsColumn(ByVal reader As IDataReader, ByVal name As String) As Boolean
For i As Integer = 0 To reader.FieldCount - 1
If reader.GetName(i).Equals(name, StringComparison.CurrentCultureIgnoreCase) Then Return True
Next
Return False
End Function
या (सी # में)
public static bool ReaderContainsColumn(IDataReader reader, string name)
{
for (int i = 0; i < reader.FieldCount; i++) {
if (reader.GetName(i).Equals(name, StringComparison.CurrentCultureIgnoreCase)) return true;
}
return false;
}
: ओ)
तुम भी IDataReader.GetSchemaTable
उपयोग कर सकते हैं के सभी कॉलम की एक सूची प्राप्त करने के लिए पाठक।
GetSchemaTable लौटाए गए डेटा संरचना के कॉलम सूचीबद्ध नहीं करता है। – JamesEggers
हां यह करता है। पाठक से प्रत्येक पंक्ति में पहला आइटम। GetSchemaTable() पंक्तियां कॉलम नाम हैं। यानी पाठक। GetSchemaTable() पंक्तियां [0] [0] मुझे पहला कॉलम नाम देता है। –
पिछली बार मैंने ऐसा करने की कोशिश की, उसने मुझे कॉलमा जैसे schema_info दिया। मुझे फिर से कोशिश करनी होगी हालांकि यह थोड़ी देर हो चुकी है। – JamesEggers
सबसे अच्छा समाधान मैं का उपयोग किया है इस तरह यह क्या कर रहा है:
DataTable dataTable = new DataTable();
dataTable.Load(reader);
foreach (var item in dataTable.Rows)
{
bool columnExists = item.Table.Columns.Contains("ColumnName");
}
पाठक [ "columnName"] के माध्यम से प्राप्त करना चाहते हैं और अशक्त या DBNull के लिए जाँच फेंक होगा एक अपवाद।
Enumerable.Range(0, reader.FieldCount).Any(i => reader.GetName(i) == "ColumnName")
- 1. का पता लगा रहा है, तो एक निर्देशिका डेल्फी
- 2. का पता लगा रहा है, तो कुंजी मोबाइल डिवाइस
- 3. का पता लगा रहा है कि एक विधि
- 4. का पता लगा रहा फोन उन्मुखीकरण
- 5. का पता लगा रहा समान छवियां
- 6. का पता लगा रहा गतिविधि परिणाम
- 7. का पता लगा रहा समर्थन jQuery
- 8. एंड्रॉयड: का पता लगा रहा scrollview नीचे
- 9. का पता लगा रहा स्मृति रिसाव वस्तुओं
- 10. का पता लगा रहा है, तो NSDate एक सप्ताह के अंत में दिन
- 11. रूबी रत्नों का पता नहीं लगा रहा
- 12. का पता लगा रहा मनमाना आकार
- 13. का पता लगा रहा कमांड अतुल्यकालिक BeginExecuteReader
- 14. MFC में एक भी माउस क्लिक का पता लगा रहा
- 15. का पता लगा रहा है, तो स्क्रीनसेवर सक्रिय होता है और/या उपयोगकर्ता विंडोज
- 16. का पता लगा रहा है, तो किसी सरणी अनुक्रमित है या साहचर्य
- 17. क्यों ऑटोकॉन्फ ठीक से बूस्ट का पता लगाने का पता नहीं लगा रहा है?
- 18. का पता लगा रहा है कि अगर मैं SharePoint
- 19. का पता लगा रहा है जब स्वत: भरण
- 20. आउटगोइंग कॉल का पता लगा रहा है और एंड्रॉयड
- 21. एंड्रॉइड जेस्चर लिस्टनर घटनाओं का पता नहीं लगा रहा है
- 22. , डुप्लिकेट रिकॉर्ड का पता लगा रहा केवल पहले का चयन करके और साथ गिनती LINQ/सी #
- 23. का पता लगा रहा एक प्रकार सी में से प्राप्त किया जा सकता है अगर ++
- 24. का पता लगा रहा क्या लक्ष्य वस्तु जब NullReferenceException
- 25. WPF में उपयोगकर्ता दबाने F10 का पता लगा रहा
- 26. गिट एक फ़ाइल का पता नहीं लगा रहा है और इसमें नहीं है .gitignore
- 27. पर्ल एरे का पता लगा सकता है?
- 28. एक्सकोड मेरे डिवाइस का पता नहीं लगा रहा
- 29. नेट चिंतन: का पता लगा रहा IEnumerable <T>
- 30. पीएचपी - का पता लगा रहा दूरस्थ होस्ट वियोग
यह खराब प्रदर्शन करेगा – DalSoft