2016-12-22 13 views
7

लौटने के लिए लिंक संग्रहित प्रक्रिया मैं इकाई फ्रेमवर्क कोड-प्रथम दृष्टिकोण का उपयोग कर रहा हूं। मैं DbContext कक्षा से संग्रहीत प्रक्रिया को कॉल करना चाहता हूं और एक्सएमएल आउटपुट प्राप्त करना चाहता हूं।एक्सएमएल

संग्रहित प्रक्रिया (SQL सर्वर):

CREATE PROCEDURE xml_test  
AS 
BEGIN 
    DECLARE @xml1 xml 

    SET @xml1 = (SELECT * from Product FOR XML RAW) 

    SELECT @xml1 AS my_xml 
END 

LINQ इकाई की रूपरेखा:

using (DBContext db = new DBContext()) 
{ 
    var ProductList = await db.Database.ExecuteSqlCommandAsync("exec xml_test"); 
} 

यहाँ ProductList सूची -1 लौटा रहा है।

मैं संग्रहीत प्रक्रिया द्वारा लौटाया गया एक्सएमएल आउटपुट प्राप्त करना चाहता हूं।

नोट: मैंने बिना किसी सहायता के ExecuteSqlCommand, SqlQuery जैसे तरीकों का भी प्रयास किया है।

+0

मुझे लगता है [यह] (http://stackoverflow.com/questions/10339750/entity-framework-stored-procedure-return-value) मदद कर सकता है। – Shakra

उत्तर

6

पर MSDN आधार पर:

अद्यतन, सम्मिलित करें के लिए, और बयानों हटाएँ, वापसी मान आदेश से प्रभावित पंक्तियों की संख्या है। जब एक ट्रिगर डालने या अद्यतन होने पर एक ट्रिगर मौजूद होता है, तो वापसी मूल्य में सम्मिलित या अद्यतन ऑपरेशन और ट्रिगर या ट्रिगर्स द्वारा प्रभावित पंक्तियों की संख्या दोनों से प्रभावित पंक्तियों की संख्या शामिल होती है। अन्य सभी प्रकार के बयान के लिए, वापसी मूल्य -1 है। यदि रोलबैक होता है, तो वापसी मूल्य भी -1 होता है।

तो ExecuteSqlCommandInsert, Update, Delete तरह के प्रश्नों के लिए एक पूर्णांक देता है और इसका मतलब है पंक्ति की संख्या एक गैर क्वेरी द्वारा को प्रभावित किया। तो ExecuteSqlCommand पूछताछ के लिए उपयुक्त नहीं है।

यह भी एक आम समस्या है क्योंकि इकाई फ्रेमवर्क बॉक्स से संग्रहीत प्रक्रिया रिटर्न मानों का समर्थन नहीं कर सकता है और ऐसा इसलिए है क्योंकि ईएफ एक ओआरएम है, एसक्यूएल प्रतिस्थापन नहीं।प्रश्नों के लिए आप Database.SqlQuery<TElement> विधि का उपयोग करने की जरूरत है: ExecuteNonQuery साथ

Getting data from stored procedure with Entity Framework

और यह: में मॉडल सबसे पहले समान समस्या के लिए नीचे दिए गए लिंक की जाँच करें

ExecuteNonQuery returning -1 when using sql COUNT despite the query string

समाधान :

var ProductList = db.Database.SqlQuery<string>("exec xml_test").ToList(); 
+1

लेकिन संग्रहित प्रक्रिया 'डेटाबेस। SQL सर्वर' का उपयोग करके xml लौटाती है, यह किसी दिए गए प्रकार के तत्वों को वापस कर देगी लेकिन एक्सएमएल एक आदिम प्रकार नहीं है। यदि मैं गलत हूं तो मुझे सही करों। –

2

Database.ExecuteSqlCommand पूछताछ नहीं, सीआरयूडी ऑपरेशन के लिए उपयोग किए गए आदेश निष्पादित करता है।

Database.SqlQuery का उपयोग क्वेरी के लिए है। यह किसी दिए गए प्रकार के तत्वों को वापस कर देगा लेकिन xml एक आदिम प्रकार नहीं है और शायद यह एक कारण है कि LINQ काम नहीं कर रहा है। संग्रहीत प्रक्रिया में xml nvarchar(max) पर प्रयास करें यह स्ट्रिंग प्रकार होगा।

। तो अपने संग्रहीत प्रक्रिया देखने के लिए की तरह करना चाहिए:

CREATE PROCEDURE xml_test  
AS 
BEGIN 
    DECLARE @xml1 xml 

    SET @xml1 = (SELECT * from Product FOR XML RAW) 

    SELECT CAST(@xml1 as nvarchar(max)) 
END 
+0

क्षमा करें, कास्ट करने में असमर्थ। – Pearl

+1

@Pearl इस अद्यतन को चेक करें। –

4

मुझे लगता है कि आप इस तरह SQLQuery उपयोग कर सकते हैं:

using (var dbcontext = new DBContext()) 
{ 
    //Reading stored procedure results as List<string> 
    var r = dbcontext.Database.SqlQuery<string>("EXEC xml_test").ToList(); //Note: EXEC is optional 

    //Joining strings to one string that causes in resulting long strings 
    var xmlString = string.Join("", r); 

    //Now you can load your string to a XmlDocument 
    var xml = new XmlDocument(); 

    //Note: You need to add a root element to your result 
    xml.LoadXml($"<root>{xmlString}</root>"); 
} 

नोट: अपने संग्रहीत प्रक्रिया से रिकॉर्ड प्राप्त करने के लिए आप BEGIN के बाद SET NOCOUNT ON; जोड़ने की जरूरत है;)।

CREATE PROCEDURE [dbo].[xml_test] 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT * from dbo.AspNetUsers FOR XML RAW; 
END 
+0

को कथन के 'EXEC' भाग की आवश्यकता नहीं है - बस' xml_test'। –

+0

@TiesonT। टीएनएक्स, मैं इसके बारे में एक नोट जोड़ता हूं;)। –

1

जैसा कि shA.t "FOR XML" द्वारा उल्लिखित किया जा सकता है। हालांकि इस परिदृश्य को संभालने के लिए, इस परिदृश्य को संभालने के लिए, स्ट्रिंग/एक्सएमएल (ईएफ के माध्यम से फ़ंक्शन कॉल के बाद वापस लौटाया गया) का उपयोग करने की देखभाल करने के लिए एक चीज है, आप this पर एक नज़र डाल सकते हैं। अगर कोड डिज़ाइन की अनुमति भी है, तो आप Ouptput parameters with Enitity Framework का भी उपयोग कर सकते हैं।