2010-10-18 11 views
5

SQL सर्वर में, आईडी शून्य पूर्णांक नहीं है, और एक पहचान है।SQLCommand विधि ExecuteScalar() वापस डेटा प्रकार क्या डेटा प्रकार करता है?

SqlCommand cmd = new SqlCommand(); 
cmd.Connection = _conn; 
cmd.CommandText = @"INSERT INTO [Users] (Name, Email, Password) VALUES (@name, @email, @pass); SELECT SCOPE_IDENTITY()"; 
cmd.Parameters.AddWithValue("@name", newUser.Name); 
cmd.Parameters.AddWithValue("@email", newUser.Email); 
cmd.Parameters.AddWithValue("@pass", newUser.PasswordHash); 
int id = (int)cmd.ExecuteScalar(); 

ExecuteScalar() यहाँ लौटने क्या है:

जब मैं निम्नलिखित कोड चलाने के लिए, मैं अंतिम पंक्ति पर एक InvalidCastException मिल सकता है? जो कुछ भी अपनी लौटने एक toString() करता है कि यह एक नंबर की तरह लग रहे है, तो कोड के इस भयंकर लाइन काम करता है:

int id = Int32.Parse(cmd.ExecuteScalar().ToString()); 
+7

यदि आप 'GetType() 'को कॉल करते हैं तो क्या होता है? – SLaks

+0

वाह, मैंने इसके बारे में क्यों नहीं सोचा? यह एक दशमलव लौट रहा है। धन्यवाद। – Patty

उत्तर

2

यह शायद इस तरह के long के रूप में, एक अलग संख्यात्मक प्रकार का एक बॉक्स्ड उदाहरण लौटा रहा है।
A boxed long cannot be converted to int

आप वापसी मूल्य पर GetType() पर कॉल कर सकते हैं यह देखने के लिए कि वास्तव में यह किस प्रकार है।

+1

इस उत्तर पर विस्तार करने के लिए, ExecuteScalar रिटर्न प्रकार ऑब्जेक्ट है, जिसका अर्थ है कि किसी भी मान प्रकार को बॉक्स किया गया होगा, आप मूल प्रकार के अलावा किसी अन्य बॉक्स में बॉक्स किए गए मान प्रकार को नहीं डाल सकते –

0
अपने सम्मिलित बयान

SELECT SCOPE_IDENTITY() 

यह [उपयोगकर्ता] तालिका में सम्मिलित पंक्ति की पहचान मूल्य लौटा रहा है के अंत से

9

SCOPE_IDENTITY() कोड में एक decimal देता है, अन्यथा TSQL में NUMERIC(38,0) के रूप में जाना।

http://msdn.microsoft.com/en-us/library/ms190315.aspx

तो अगर आप एक सीधा डाली चाहते हैं, आप (int)(decimal)cmd.ExecuteScalar(); कर सकते हैं। ध्यान दें कि एक दशमलव से int रूपांतरण सख्त अर्थ में जानकारी खो सकता है, इसलिए सलाह दीजिए। लेकिन आपकी पहचान कॉलम पूर्णांक होने के साथ, रूपांतरण सुरक्षित रहेगा।

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