2011-02-07 6 views
5

नहीं कर सकता हूं। मैं System.Data.SQLite का उपयोग कर रहा हूं, एक SQLite डेटाबेस तालिका से चयन कर रहा हूं जहां एक कॉलम में 'पूर्णांक' टाइप होता है, और जब मैं ऐसा कुछ करता हूं:जब मैं 'int' प्रकार के स्क्लाइट कॉलम से चयन करता हूं, तो मैं .NET int पर जा सकता हूं लेकिन जब मैं 'पूर्णांक' कॉलम से चुनता हूं तो मैं

int x = (int)reader["myColumn"]; 

यह विफल रहता है। समस्या यह नहीं है कि मूल्य शून्य है; कॉलम शून्य नहीं है। यदि मैं कॉलम के डेटा प्रकार को 'int' में बदलता हूं तो यह ठीक काम करता है। कॉलम में मान '2', '3', '4', आदि हैं; कुछ भी बड़ा नहीं है।

कोई भी जानता है कि यह व्यवहार की अपेक्षा की जाती है?

उत्तर

10

जैसा कि अन्य उत्तरदाता का उल्लेख है, SQLite पूर्णांक 1, 2, 3, 4, 6, या 8 बाइट्स में संग्रहीत है। हालांकि, आपको ओवरफ्लो या सीमा अपवादों से बाहर नहीं मिलेगा।

उस संदर्भ में, (int) एक कलाकार है, न कि रूपांतरण। यदि reader[] टाइप इंटीजर की ऑब्जेक्ट नहीं लौटाता है, यदि यह एक अलग संख्यात्मक प्रकार लौटा रहा है, तो इसमें शामिल मूल्य के बावजूद आपको एक कास्ट अपवाद मिलेगा।

SQLite पूर्णांक के लिए मान्य मानों की सीमा के आधार पर, मुझे लगता है कि यह मान को 64-बिट पूर्णांक, long के रूप में वापस कर रहा है। सत्यापित करने के लिए, इस प्रयास करें:

object x = reader["myColumn"]; 
Debug.WriteLine(x.GetType().Name); 
+1

मैं वास्तव में 'लंबे x = (लंबे) पाठक ["myColumn"] की खोज के बाद खुद को जवाब देने के लिए इस प्रश्न पर लौट रहा था;' ठीक काम करता है। आप बिल्कुल सही हैं - यह एक इंट 64 था - इसलिए बस लंबे चर का उपयोग करना मेरे लिए काम करेगा। इस कारण व्यवहार INT और INTEGER के लिए अलग-अलग काम करता है, यह अभी भी मेरे लिए अजीब है। मैं तालिका में समान डेटा मानों के लिए INT/INTEGER से कास्टिंग की सफलता/विफलता दोहरा सकता हूं, और समस्या को किसी अन्य तालिका में भी दोहरा सकता हूं। संभवतः चालक में थोड़ी सी असंगतता। – Rory

0

SQLite http://www.sqlite.org/datatype3.html INTEGER। मान मूल्य के परिमाण के आधार पर 1, 2, 3, 4, 6, या 8 बाइट्स में संग्रहीत एक हस्ताक्षरित पूर्णांक है।

नेट http://msdn.microsoft.com/en-us/library/cs7y5x0x(VS.90).aspx पूर्णांक -२१४७४८३६४८ .. 2,147,483,647

तो मैं एक अतिप्रवाह या 'बड़े' SQLite पूर्णांक मूल्यों के लिए सीमा त्रुटि से बाहर उम्मीद करेंगे।

2

अपवाद क्योंकि datareader.Item[] रिटर्न object होता है।

समस्या मुक्केबाजी/अनबॉक्सिंग के कारण है। यह डेटाबेस में ही कोई लेना देना नहीं है ...

long a = 1; 
int b = 2; 
object objectA = a; 
object objectB = b; 
Console.WriteLine((int)a); 
Console.WriteLine((long)b); 
Console.WriteLine((int)objectA); 
Console.WriteLine((long)objectB); 

कंसोल आउटपुट 2 तो 1, लेकिन objectA, objectB के कलाकारों पर एक अपवाद फेंक देते हैं। यह ओडीबीसी ड्राइवरों के साथ कुछ भी करने के लिए .NET की विशेषता नहीं है।

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

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