2015-08-21 13 views
30

के साथ संग्रहीत प्रक्रिया से डेटा प्राप्त करना मैं GridView नियंत्रण को पॉप्युलेट करने के लिए डेटाबेस संदर्भ ऑब्जेक्ट (एंटीटी फ्रेमवर्क 6.1.1 का उपयोग करके) को एक गतिशील SQL संग्रहीत प्रक्रिया के साथ एक तालिका प्राप्त करने का प्रयास कर रहा हूं। मैं डेटा पुनर्प्राप्त करने में विफल रहता हूं।एंटिटी फ्रेमवर्क

यहां संग्रहीत प्रक्रिया है। यह संग्रहीत प्रक्रियाओं में एसक्यूएल इंजेक्शन के बारे में एक छात्र प्रदर्शन के लिए है, इसलिए मुझे पता है यह इंजेक्शन योग्य है और यह ठीक है।

ALTER PROCEDURE dbo.SearchProducts 
    @SearchTerm VARCHAR(max) 
AS 
BEGIN 
    DECLARE @query VARCHAR(max) 
    SET @query = 'SELECT * FROM dbo.Products WHERE Name LIKE ''%' + @SearchTerm + '%''' 
    EXEC(@query) 
END 

सी # कोड के पीछे मैं तो संग्रहीत प्रक्रिया निष्पादित करने के लिए उपयोग करते हैं:

var db = new MyEntities(); 
var TEST_SEARCH_TERM = "product"; 
var result = db.SearchProducts(TEST_SEARCH_TERM); 

MyGridView.DataSource = result; 
MyGridView.DataBind(); 

जब मार डाला, दृश्य स्टूडियो में डेटाबेस Explorer में, संग्रहीत प्रक्रिया ठीक काम करता है। लेकिन जब चल रहे एएसपी.NET ऐप में निष्पादित किया गया, तो मुझे विधि में अपवाद मिलता है क्योंकि result-1IEnumerableDataSet के बजाय संग्रहीत प्रक्रिया के चयन से उत्पन्न वस्तुओं को शामिल करता है।

मैं डेटा कैसे पुनर्प्राप्त कर सकता हूं और अपना GridView पॉप्युलेट कर सकता हूं?

+0

अपने एडीएमएक्स में, फ़ंक्शन आयात पर जाएं -> सर्च प्रोडक्ट्स, और डबल क्लिक करें। वापसी प्रकार क्या सेट है? – Vahlkron

+0

रिटर्न प्रकार सेट नहीं है। यह (कोई नहीं) है। – mak

+0

लगता है जैसे इसे कॉम्प्लेक्स पर सेट करने की आवश्यकता है। एकमात्र चीज जो मैं सुझा सकता हूं, क्योंकि मेरे पास ईएफ नहीं है, जब मैं ऐसा करता हूं तो मुझे समस्याएं देते हैं, एसपी में इच्छित कॉलम को स्पष्ट रूप से चुनने के लिए अपना * बदलें। शायद ईएफ आपके रिटर्न प्रकार को निर्धारित करने के लिए देखता है। फिर अपने ईडीएमएक्स को अपडेट करें ताकि परिवर्तन ईएफ में दिखाई दे। – Vahlkron

उत्तर

27

इस समस्या को हल करने के लिए निम्न चरणों का उपयोग:

  1. आप एक समारोह के रूप में जमा प्रक्रिया आयात करने के लिए की जरूरत है। अपने एंटिटी मॉडल के वर्कस्पेस क्षेत्र पर राइट-क्लिक करें और Add -> Function Import चुनें।
  2. जोड़ें फंक्शन आयात संवाद में, उस नाम को दर्ज करें जिसे आप अपनी संग्रहीत प्रक्रिया को अपने मॉडल में संदर्भित करना चाहते हैं उदाहरण के लिए Search_Products, ड्रॉप डाउन सूची से अपनी प्रक्रिया चुनें, और Entities होने की प्रक्रिया का वापसी मूल्य चुनें और ड्रॉप डाउन सूची से Products चुनें।
  3. फिर पीछे कोड में:

    var db = new MyEntities(); 
    var TEST_SEARCH_TERM = "product"; 
    var result = db.Search_Products(TEST_SEARCH_TERM);//Search_Products is the name that you specified in Function Import dialog 
    
    MyGridView.DataSource = result; 
    MyGridView.DataBind(); 
    

कारण यह है कि आप परिणाम के लिए -1 मिलता है कि इकाई की रूपरेखा संग्रहित नहीं समर्थन कर सकते हैं प्रक्रिया वापसी बॉक्स से बाहर का सम्मान करता है। मुझे लगता है कि संग्रहित प्रक्रिया वापसी मूल्यों का समर्थन इकाई ढांचे के संस्करण पर निर्भर करता है। इसके अलावा इकाई फ्रेमवर्क में समृद्ध संग्रहीत प्रक्रिया समर्थन नहीं है क्योंकि यह एक ओआरएम है, एसक्यूएल प्रतिस्थापन नहीं।

+4

सभी कोड भाषाओं की मीठी मां। मेरे पास कोई अजीब विचार नहीं है कि यह अब क्यों काम करता है। मुझे आशा है कि यह स्थिर रहता है। धन्यवाद x1000 दोस्त। +100 प्रतिष्ठा अच्छी तरह से योग्य है। – mak

0

सत्यापित करें कि आपके ईडीएमएक्स का रिटर्न टाइप है: फंक्शन आयात पर जाएं -> सर्च प्रोडक्ट्स, और डबल क्लिक करें।

कॉम्प्लेक्स रिटर्न प्रकार का उपयोग करने के लिए, इकाई फ्रेमवर्क की आवश्यकता होगी कि आप * * का उपयोग करने के बजाय अपनी संग्रहीत प्रक्रिया में कॉलम नामों को स्पष्ट रूप से परिभाषित करें।

एक बार आपकी संग्रहीत प्रक्रिया कॉलम नामों को परिभाषित करने के लिए संशोधित की जाती है, तो आप प्रोजेक्ट में अपना मॉडल अपडेट कर सकते हैं। (ध्यान दें, की सपा पूरी तरह से ड्रॉप प्रदर्शन, और फिर इसे वापस अपने edmx को जोड़ने के लिए सबसे अच्छा मार्ग हो सकता है।)

संपादित

हो सकता है कि आप निम्नलिखित की तरह अपने सपा संशोधित कर सकते हैं:

ALTER PROCEDURE dbo.SearchProducts 
    @SearchTerm VARCHAR(max) 
AS 
BEGIN 
    SELECT * FROM dbo.Products WHERE Name LIKE '%' + @SearchTerm + '%' 
END 
+0

मॉडल में इस संग्रहीत प्रक्रिया में जटिल प्रकार जोड़ने का प्रयास करते समय, मॉडल एक्सप्लोरर आपको इसे जोड़ने की अनुमति नहीं देता है क्योंकि "चयनित संग्रहीत प्रक्रिया किसी भी कॉलम को वापस नहीं करती है" – mak

+0

क्या आप इसे संशोधित कर सकते हैं जैसा कि मैंने ऊपर किया है, या आपके पास है @query? .... अपवाद के साथ कि आपको विशेष रूप से अपने कॉलम घोषित करना चाहिए। – Vahlkron

+0

तो ... इसे "उत्पाद" प्रकार की इकाई के रूप में रिटर्न प्रकार को परिभाषित करके काम कर रहा है। अब मैं चाहता हूं कि रिटर्न टाइप एक जटिल प्रकार हो, न कि एक इकाई। इमा ने जो सुझाव दिया है उसे आजमाएं। वैसे भी, आपके समाधान में मदद मिली, मैं अपने आखिरी प्रयासों के बाद स्वीकार करूंगा। – mak

3

मैं गतिशील एसक्यूएल का उपयोग कर संग्रहित प्रक्रियाओं के साथ पहले इस पर आया हूं। अगर मैं 'सेट फ़ैमनी ऑफ़ ऑफ़' लाइन जोड़ता हूं तो मुझे जटिल प्रकारों का उपयोग करके सफलता मिली है। (https://msdn.microsoft.com/en-us/library/ms173839.aspx देखें) ईएफ मॉडल में जोड़े जाने से पहले मेरी संग्रहीत प्रक्रिया के शीर्ष पर। एक बार जब आप अपने जटिल प्रकार के साथ अपना मॉडल सेटअप कर लें, तो इस लाइन को हटाना सुनिश्चित करें।

उदाहरण:

कैसे अपने इकाई डेटा मॉडल में एक संग्रहीत प्रक्रिया आयात करने के लिए:

ALTER PROCEDURE dbo.SearchProducts 
    @SearchTerm VARCHAR(max) 
AS 
BEGIN 
    SET FMTONLY OFF; 
    DECLARE @query VARCHAR(max) 
    SET @query = 'SELECT * FROM dbo.Products WHERE Name LIKE ''%' + @SearchTerm + '%''' 
    EXEC(@query) 
END 
+0

हाँ ने कोशिश की, मेरी मदद नहीं की। लेकिन मुझे यह दिलचस्प लगता है क्योंकि यह मुझे ईएफ की आंतरिक कार्यप्रणाली को समझता है और परिणाम सेट बनाने के लिए मेटाडेटा कैसे प्राप्त करता है। – mak

0

आप अपने समस्या हल गए हैं लगता है, वहाँ Microsoft से आधिकारिक दस्तावेज नीचे दिए गए लिंक पर उपलब्ध है: https://msdn.microsoft.com/en-us/library/vstudio/bb896231(v=vs.100).aspx

एफई डिजाइनर परिसर प्रकार: https://msdn.microsoft.com/en-gb/data/jj680147.aspx

सुनिश्चित करें कि आप .NET के नवीनतम संस्करण के साथ काम कर रहे हैं और जब आप अपने डेटाबेस में परिवर्तन करते हैं तो आप अपना मॉडल अद्यतित रखते हैं।

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