2010-01-25 10 views
44

कंसोल के बजाय ट्रेस या डीबग को आउटपुट क्वेरी करने के लिए फ़्लुएंट एनएचबेर्नेट को कॉन्फ़िगर कैसे करें? मैं MsSqlConfiguration.MsSql2008.ShowSql() का उपयोग कर रहा हूं लेकिन इसमें कोई पैरामीटर नहीं है और मुझे Google पर कुछ भी नहीं मिल रहा है।कंसोल के बजाय ट्रेस या डीबग को आउटपुट क्वेरी करने के लिए फ़्लुएंट एनएचबेर्नेट को कॉन्फ़िगर कैसे करें?

उत्तर

94

मैं हर जगह मंच और ब्लॉग पोस्ट से देख सकता हूं कि मेरे सामने बहुत से अन्य लोगों ने एसक्यूएल स्टेटमेंट प्राप्त करने के लिए एक रास्ता तलाश लिया है क्योंकि वे निष्पादन के लिए तैयार हैं। उत्तर आमतौर पर "आप नहीं कर सकते", या "आपको नहीं करना चाहिए" के आधार पर कुछ है।

चाहे मुझे चाहिए या नहीं, यही वही है जो मैं चाहता था।

खोज, जांच और असफल प्रयासों के घंटों के बाद, और आखिर में मैं इसके साथ आया।

using NHibernate; 
using System.Diagnostics; 

public class SqlStatementInterceptor : EmptyInterceptor 
{ 
    public override NHibernate.SqlCommand.SqlString OnPrepareStatement(NHibernate.SqlCommand.SqlString sql) 
    { 
     Trace.WriteLine(sql.ToString()); 
     return sql; 
    } 
} 

बेशक, आप Trace.WriteLine() करने के लिए यहाँ की जरूरत नहीं है, तो आप एक लॉग फ़ाइल, या जो कुछ भी आप की जरूरत के लिए यह लिख सकते हैं:

एक इंटरसेप्टर ऊपर लिखें।

अपने कनेक्शन प्रबंधक में, इतना की तरह अपने इंटरसेप्टर ऊपर हुक:

protected virtual void Configure(FluentConfiguration config) 
{ 
    config.ExposeConfiguration(x => 
            { 
             x.SetInterceptor(new SqlStatementInterceptor()); 
            }); 
} 

यह है कि जटिल नहीं है। मेरे परिप्रेक्ष्य से, इस एक्सएमएल को फ्लुएंट से एनएचबेर्नेट के माध्यम से धक्का देने की कोशिश करने से निश्चित रूप से आसान है - क्योंकि फ्लुएंट एक्सएमएल फाइल को हटा देता है।

ध्यान रखें, आपके पास केवल एक इंटरसेप्टर हो सकता है - इसलिए यदि आपके पास पहले से ही है, तो आपको इस सुविधा को अपने मौजूदा इंटरसेप्टर के साथ एकीकृत करने की आवश्यकता हो सकती है। उस नोट पर, आप इसे एक व्यापक नाम देना चाहेंगे - उदा। MyAppInterceptor, ताकि एक विशिष्ट उद्देश्य को इंगित न किया जाए, क्योंकि आप बाद में अन्य सुविधाओं को जोड़ना चाहते हैं।

आशा है कि यह किसी और के लिए सहायक होगा! :-)

+0

जैसे कुछ का उपयोग करें, महान समाधान, नरक के रूप में सरल और यह सिर्फ काम करता है, इसे मेरे साथ जोड़ा परीक्षण सत्र फैक्ट्री हालांकि #if DEBUG के साथ जोड़ने के लिए संभव है। धन्यवाद! –

+4

शायद पैरामीटर को भरना भी संभव है? मुझे 'SELECT * से MyObject WHERE Id =?' जैसे प्रश्नों में मानों के बजाय '?' (प्रश्न चिह्न) मिलते हैं। मैं देख रहा हूँ वहाँ एक 'IEnumerable NHibernate.SqlCommand.SqlString.GetParameters()' –

+1

) की जगह @Mike 'sql.ToString (' 'साथ base.OnPrepareStatement (SQL)' –

33

शायद आप log4net का उपयोग करना चाहते हैं, ShowSql नहीं।

<configSections> 
    <section name="log4net" 
    type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> 
    </configSections> 

    <log4net debug="false"> 
    <appender name="WindowsDebugOutput" type="log4net.Appender.DebugAppender, 
     log4net"> 
     <layout type="log4net.Layout.PatternLayout,log4net"> 
     <param name="ConversionPattern" 
       value="%d{ABSOLUTE} %-5p %c{1}:%L - %m%n" /> 
     </layout> 
    </appender> 

    <logger name="NHibernate.SQL" additivity="false"> 
     <level value="DEBUG" /> 
     <appender-ref ref="WindowsDebugOutput" /> 
    </logger> 
    </log4net> 

और फिर एक NHibernate सत्र खोलने से पहले अपने कोड से फोन:

log4net.Config.XmlConfigurator.Configure(); 

जब आप log4net DLL के लिए एक संदर्भ जोड़ने के लिए, यह सुनिश्चित कर लें यहाँ कुछ विन्यास डीबग करने के लिए क्वेरी भेजने के लिए है अपनी "कॉपी स्थानीय" संपत्ति को "सत्य" पर सेट करें।

यह FluentNHibernate के लिए विशिष्ट नहीं है, यह NHibernate के किसी भी प्रकार में समान कार्य करता है।

+0

नोबिश प्रश्न, लेकिन, इस कॉन्फ़िगरेशन फ़ाइल को Winforms प्रोजेक्ट में कहां रखा जाए?बहुत सारे हाइबरनेट की प्रलेखन वेबसाइटें नीचे हैं, और मुझे यह नहीं पता कि यह XML जानकारी कहां रखी जाए। धन्यवाद। –

+1

@ माइक - इसे प्रोजेक्ट रूट निर्देशिका में app.config में जाना चाहिए, जो संकलन समय पर .exe.config के रूप में बिन निर्देशिका में कॉपी हो जाता है। –

+1

3 साल से अधिक के उत्तर पर एक टिप्पणी पर प्रतिक्रिया करने के लिए बहुत बढ़िया! धन्यवाद बड़ा समय! –

11

मैं एसक्यूएल सर्वर के साथ इस की कोशिश की है नहीं, लेकिन SQLite के साथ, निम्नलिखित कोड उत्पन्न दिखाई देंगे आउटपुट विंडो में एसक्यूएल (डीबग मेनू -> विंडोज -> आउटपुट, में VS2008)।

"आउटपुट दिखाएं:" आउटपुट विंडो में कॉम्बो बॉक्स को "डीबग" पर सेट किया जाना चाहिए - VS2008 ने मेरे लिए यह स्वचालित रूप से किया था।

  sessionFactory = Fluently.Configure() 
       .Database(SQLiteConfiguration.Standard 
          .UsingFile(DbFile) 
          // Display generated SQL in Output window 
          .ShowSql() 
         ) 
       .Mappings(m => m.AutoMappings.Add(GetAutoPersistenceModel())) 
       .BuildSessionFactory() 
       ; 

चेतावनी का एक शब्द - इसे चालू करने से निष्पादन काफी धीमा हो सकता है।

+3

विजुअल स्टूडियो में आउटपुट विंडो कंसोल, डीबग और ट्रेस आउटपुट दिखाती है। शोस्क्ल विधि कंसोल को लिखती है, डीबग या ट्रेस नहीं। आपकी सिफारिश उस बात से अलग नहीं है जो उसने कहा है कि वह पहले से ही कर रहा है। –

+0

@ माइकल- मैंने अभी इसका परीक्षण किया है, और यह वर्णित रूप से वर्णित है! एसक्यूएलएट बनाम SQL सर्वर के लिए एफएनएच इंटरफ़ेस के कार्यान्वयन में संभवतः एक अंतर? –

+1

यह वही "डीबग" नहीं है (नोटिस "ट्रेस" या "कंसोल" के लिए कोई विकल्प नहीं है)। :) यह देखने के लिए कि क्या यह वास्तव में डीबग को लिख रहा है, http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx –

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