11

मैं इकाई फ्रेमवर्क 4.1 का उपयोग कर रहा हूं और कभी-कभी संग्रहीत प्रक्रियाओं को कॉल करने की आवश्यकता होती है। इनमें से कुछ वापसी मूल्यों के रूप में वापसी करते हैं। उदाहरण के लिएइकाई ढांचे 4.1 में संग्रहीत प्रक्रिया से मुझे एक int कैसे वापस करना चाहिए?

CREATE PROCEDURE ... 
... 
INSERT INTO ... 
SELECT @@Identity 

(अद्यतन: हटा दिया गया मान, पहचान प्रासंगिक नहीं हम वापस लौट रहे हैं।)

मेरे पास मेरी respository वर्ग में निम्न कोड:

var orderNo = context.Database.SqlQuery<int>("EXEC myProc").Single(); 

यह त्रुटि संदेश The specified cast from a materialized 'System.Decimal' type to the 'System.Int32' type is not valid.

यदि मैं ऊपर दिए गए कोड को

पर बदलता हूं
var orderNo = context.Database.SqlQuery<decimal>("EXEC myProc").Single(); 

सबकुछ काम करता है।

अब, मुझे लगता है कि मुझे एक int वापस करने में सक्षम होना चाहिए। ऐसा करने का सही तरीका क्या है?

+3

@@ वापस नहीं लौटें या आप अप्रत्याशित व्यवहार में भाग सकते हैं क्योंकि @@ पहचान सत्र की परवाह किए बिना अंतिम आईडी लौटाती है। 'SCOPE_IDENTITY()' – Icarus

उत्तर

10

मुझे लगता है, अपने प्रश्न का संपादन के आधार पर है कि यह केवल एक मुद्दा है: आप अपनी सपा एक डाली जोड़कर इसे ठीक कर सकते जब आप पहचान वापस कर रहे हैं?

यदि ऐसा है, तो यह दशमलव है क्योंकि @@ पहचान (और SCOPE_IDENTITY) संख्यात्मक (38,0) लौटाती है। इस प्रश्न का उत्तर देखें: Why does select SCOPE_IDENTITY() return a decimal instead of an integer? जैसा कि उल्लेख किया गया है, int को कास्टिंग करने से ईएफ को प्रकार का सही ढंग से पता लगाने की अनुमति देनी चाहिए।

7

@@Identity वापस न करें या आप अप्रत्याशित व्यवहार में भाग सकते हैं क्योंकि @@Identity सत्र के बावजूद अंतिम आईडी देता है। का प्रयोग करें SCOPE_IDENTITY() बजाय

मैं कल्पना कर सकते हैं कि लौटने SELECT cast(SCOPE_IDENTITY() as int)

सी # ओर

4

@@ पहचान पर आपके लिए क्या करेंगे 38 और 0 के पैमाने की परिशुद्धता के साथ एक संख्यात्मक प्रकार देता है, तो .NET सही ढंग से पहचानता है एक दशमलव वापस करने के रूप में आपका एसपी। मैं इसे शीघ्र ही अपनी पोस्टिंग के बाद क्लिक किया है, तो थोड़ी देर बाद ताज़ा किया - -

CREATE PROCEDURE ... 
... 
INSERT INTO ... 
SELECT CAST(@@Identity as int) 
+0

का उपयोग करें ध्यान दें कि SQL सर्वर 2012 होने पर यह कोई समस्या नहीं प्रतीत होती है, लेकिन यदि यह 200 आर 2 है। यही कारण है कि मैं इस विषय में आया था। –

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