2012-02-24 10 views
7

मेरे पास एक टेबल अपडेट करने के लिए सेट एंटिटी फ्रेमवर्क है। अद्यतन के द्वारा रोका जाता है एक के बजाय ट्रिगर है, जो RAISERROR कॉल:मैं एंटीटी फ्रेमवर्क 4 द्वारा सेट किए गए ट्रिगर में बुलाए गए RAISERROR द्वारा फेंक दिया गया एसक्यूएलएक्सप्शन कैसे पकड़ूं?

CREATE TRIGGER mySchema.UpdateBusinessObjects 
ON mySchema.BusinessObjects 
INSTEAD OF UPDATE 
AS 
    RAISERROR(''test error from SQL'',16,1) 
    RETURN 

मेरी भंडार वर्ग में, मैं SqlException एसक्यूएल में RAISERROR द्वारा उत्पन्न पकड़ने का प्रयास कर रहा हूँ:

public void SaveBusinessObject(BusinessObject b) { 
    try { 
     repo.Entry(b).State = EntityState.Modified; 
     repo.SaveChanges(); 
    } catch (SqlException ex) { 
     // handle exception here 
    } 
} 

समस्या यह है कि सी # एसक्लएक्सप्शन को पकड़ नहीं रहा है; यह कॉलर को एक अनचाहे अपवाद के रूप में पारित किया जाता है ("एसक्यूएलएक्सप्शन उपयोगकर्ता द्वारा अनचाहे किया गया था: एसक्यूएल से परीक्षण त्रुटि")। क्या?!

ऐसा लगता है कि ईएफ की सेव चेंज() किसी भी तरह से मेरे प्रयास पकड़ ब्लॉक पर अपवाद पारित कर रहा है। यदि ईएफ अपवाद किसी भी तरह से सामान्य है, तो मुझे पकड़ने के लिए अपने कैच स्टेटमेंट को स्विच करने की कोशिश की गई है (अपवाद पूर्व), लेकिन मुझे अभी भी एक अनचाहे SqlException मिलता है। क्या मैं यहाँ कुछ आसान याद कर रहा हूँ? SaveChanges() विधि में क्या समस्या है?

+0

सिर्फ देखने के लिए जब दृश्य स्टूडियो में मोड को दूर करने में क्या होता है –

+0

यह इस स्थिति में लगता है कि 2 अपवाद दिखाए जाते हैं एक खाली पकड़ के साथ प्रयास करें: पहली बार एक "System.Data.SqlClient.SqlException" है * किसी भी * "पकड़()" प्रकार कथन द्वारा पकड़ा नहीं। दूसरा एक "System.Data.Entity.Infrastructure.DbUpdateException" है जिसे .NET द्वारा पकड़ा गया है, और इसमें पूर्वरक्षा के रूप में पूर्व शामिल है। हालांकि, केवल उत्तरार्द्ध .NET को क्रैश करने का कारण बनता है - पहले को अनदेखा किया जाता है। क्या यह हो सकता है कि पूर्व बाहरी प्रक्रिया से आ रहा है, जैसे SQL सर्वर? – rocketmonkeys

उत्तर

0

एकमात्र तरीका जिसे मैं एक कोशिश पकड़ने से बचने का अपवाद जानता हूं, एक अलग थ्रेड में अपवाद है। क्या ईएफ कोड को एक अलग धागे पर निष्पादित किया जा सकता है? हो सकता है कि आप अपवाद संवाद में 1º मौके पर अपवाद फेंकने को सक्षम कर सकें।

1

मैंने टेबल पर आपके पास लगभग उसी ट्रिगर की कोशिश की और इकाई फ्रेमवर्क के माध्यम से संबंधित (नई) ऑब्जेक्ट को सहेजने का प्रयास किया। जो मैं देख सकता हूं, उस अपवाद को फेंक दिया जा रहा है सिस्टम। डेटा.अपडेट अपवाद और एसक्यूएलएक्सप्शन नहीं। आंतरिक अपवाद SqlException है और इसमें उस कस्टम संदेश को शामिल किया गया है जिसे आपने ट्रिगर में उठाया है जो 'एसक्यूएल से परीक्षण त्रुटि' है। उम्मीद है कि यह

+0

धन्यवाद .. समस्या यह है कि मैं सबसे बुनियादी अपवाद प्रकार के साथ भी अपवाद नहीं पकड़ सकता, इसलिए मैं खोदने में असमर्थ हूं और यह पता लगाने में असमर्थ हूं कि यह किस प्रकार है। आपका क्या मतलब है "आप जो देख सकते हैं उससे"? – user941238

0

में मदद करता है मुझे यह सही समस्या थी।

मैं प्रोफाइल क्वेरी समय के लिए एमवीसी मिनी प्रोफाइलर का उपयोग कर रहा था। मैंने पाया कि अगर मैंने इसे अपनी परियोजना से हटा दिया है, तो अपवादों को पकड़ा गया था जैसा कि मैंने उम्मीद की थी।

0

वहाँ 2 चीजें हैं: -

  1. आप RAISERROR एक SqlException फेंक करना चाहते हैं, तो आप 10 की गंभीरता के साथ 10 त्रुटियाँ ऊपर इसकी गंभीरता स्थापित करने के लिए और नीचे सूचना के लिए हैं, और इस तरह डॉन 'की जरूरत अपवाद फेंक नहीं।

  2. कैच EntityException या सामान्य अपवाद के कैच ब्लॉक में ब्रेकपॉइंट सेट करें। तत्काल विंडो में, अपवाद के प्रकार का निरीक्षण करें: ex.GetType();

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