2011-06-27 17 views
5

के साथ एमवीसी-मिनी-प्रोफाइलर का उपयोग करना मैं कुछ पूर्व-मौजूदा एसक्यूएलकनेक्शन संग्रहीत प्रक्रिया कोड के साथ (भयानक) एमवीसी-मिनी-प्रोफाइलर का उपयोग करने का प्रयास कर रहा हूं (हम ईएफ या एल 2 एस का उपयोग नहीं करते हैं, केवल एडीओ .NET से SQL सर्वर 2008)। मैं इस तरह के कोड में विरासत ProfiledDb प्रकारों को एकीकृत करने के तरीके पर कुछ मार्गदर्शन की तलाश में हूं।ADO.NET SqlConnection

var con = new SqlConnection("connectionstring"); 
var cmd = new SqlCommand(); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Connection = con; 
cmd.CommandText = "SP_STORED_PROCEDURE_NAME"; 
cmd.Paramters.Add("recordsetid",SqlDbType.UniqueIdentifier).Value = recordsetid; 
var dSet = new DataSet(); 
var da = new SqlDataAdapter(cmd); 
da.fill(dSet); 
<parse DataSet> 

किसी भी विरासत ADO.NET उपयोगकर्ताओं क्योंकि सतह ऐसा लगता है कि एसक्यूएल प्रोफाइलर इस स्थिति के लिए लागू किया जाना चाहिए पर बहुत अच्छा होगा हमारे लिए यहाँ मदद

+0

नीचे सैम की प्रतिक्रिया के आधार पर मैंने केवल डैपर को लागू किया और कोड की 50 लाइनों को लगभग 20 तक ले लिया और जटिलता में काफी कमी आई। मैं पैरामीटर संग्रह के लिए 'DbDataReader' और' DbType.Guid' का उपयोग कर SqlDataReaders के लिए एक समाधान को कार्यान्वित करने में सक्षम था ('System.Data.Common' equivelant के साथ सभी एमएस एसक्यूएल विशिष्ट बिट्स को प्रतिस्थापित कर रहा है)। जैसा कि सैम ने उल्लेख किया है कि यह बहुत अधिक वर्बोज़ है और आप बहुत सारे बॉयलरप्लेट कोड लिखते हैं और आप बेहतर SqlDataAdapter – TodK

उत्तर

4

आप करने की आवश्यकता होगी आपके कनेक्शन की लपेट है और डीबीकनेक्शन CreateCommand फैक्ट्री का उपयोग करें।

इसी प्रकार पैराम पास करने के लिए आपको आधार इंटरफ़ेस विधियों का उपयोग करने की आवश्यकता होगी, और SqlParameter जैसी सामग्री से बचने के कारण यह लपेटा नहीं गया है।

तो:

var cnn = MvcMiniProfiler.Data.ProfiledDbConnection.Get(new SqlConnection(str)); 
var cmd = cnn.CreateCommand(); 
var param = cmd.CreateParameter(); 
... 

मैं परीक्षण नहीं किया डेटासेट और DataAdapters, ईमानदारी से मैं सामान इस तरह का यह बहुत कम वर्बोज़ है इन दिनों के रूप में के लिए साफ-सुथरी का उपयोग करें। यदि यह खेलता है, तो Google कोड पर रिपोर्ट करना सुनिश्चित करें।

+0

डैपर आसान tbh में shoehorn करने की कोशिश करने से बेहतर बेहतर (आईएमओ) लागू कर सकते हैं। धन्यवाद! – TodK

+0

एक 'ProfiledDbDataAdapter' कक्षा भी है जिसका उपयोग आप' SqlDataAdapter' को प्रोफाइलिंग के साथ लपेटने के लिए कर सकते हैं। Http://stackoverflow.com/a/13793409/8479 देखें – Rory

3

मेरे पास एक समान स्थिति है जहां हमारे सभी एसक्यूएल संग्रहीत प्रक्रियाओं में हैं और हमारे पास केवल ADO.NET कोड है जो उनसे कॉल करता है। मेरे पास डेटा एक्सेस लेयर भी है जो मुझे खुश है इसलिए मिनीप्रोफाइलर को समायोजित करने के लिए बस इसके हिस्सों को फिर से लिखने का विचार पसंद नहीं है।

तो जिस समझौते पर मैं बस गया था, वह प्रक्रिया कॉल के आसपास मानक MiniProfiler.Step() कॉल का उपयोग करना था। यह मेरे मामले में मदद करता है कि ExecuteReader() एट अल के लिए सभी कॉल एक आधार वर्ग का हिस्सा इसलिए मैं सभी SqlCommands में कुछ आधार तरीकों के भीतर निष्पादित हो पता कर रहे हैं, तो यह इस के समान देखने के लिए अपने मौजूदा कोड को बदलने के लिए आसान था:

protected SqlDataReader ExecuteReader() 
{ 
    SqlDataReader reader = null; 

    // sqlComm is a member of a base class which this method is part of. I also 
    // happen to know that sqlComm.CommandText will always refer to a stored 
    // procedure name so it makes it easy to view in the results. 
    using (MiniProfiler.Current.Step(sqlComm.CommandText)) 
    { 
     try 
     { 
      sqlConn.Open(); 
      reader = sqlComm.ExecuteReader(); 
     } 
     catch (SqlException exception) 
     { 
      sqlConn.Close(); 
      // Error handling removed for brevity... 
     } 
    } 

    return reader; 
} 

मुझे यकीन है कि यह सैम के उत्तर के जितना अच्छा नहीं है क्योंकि मुझे यकीन है कि परिणाम टैब में कुछ विवरण गायब होंगे, लेकिन यह मेरे लिए बहुत कम परिवर्तन के साथ डेटाबेस कॉल का विश्लेषण करने के लिए पर्याप्त रूप से काम करता है डेटा एक्सेस कोड संरचना।