2011-06-27 14 views
5

Próbuję użyć (niesamowitego) programu mvc-mini-profiler z istniejącym wcześniej kodowanym procesem SqlConnection (nie używamy EF ani L2S, tylko ADO .NET do SQL Server 2008). Szukam wskazówek, jak zintegrować dziedziczone typy ProfiledDb w tego rodzaju kodu.Używanie mvc-mini-profilera z 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> 

Każda pomoc tutaj dla nas użytkownicy spuścizna ADO.NET byłoby super, bo na powierzchni wydaje się, że SQL Profiler powinna mieć zastosowanie do tej sytuacji

+0

Na podstawie opinii Sama poniżej zaimplementowałem tylko Dappera i zredukowałem 50 linii kodu do około 20 i znacznie zmniejszyłem złożoność. Byłem w stanie zaimplementować rozwiązanie dla SqlDataReaders przy użyciu 'DbDataReader' i' DbType.Guid' dla zbierania parametrów (zastępując wszystkie bitów specyficzne dla MS SQL za pomocą equivelant 'System.Data.Common'). Jak Sam wspomniał, jest dużo bardziej gadatliwy i kończy się pisanie wielu kodów na płycie głównej i możesz być lepiej obsłużony (imo) implementując Dappera niż próbując zrzucić go do istniejącego SqlDataAdapter – TodK

Odpowiedz

4

Trzeba będzie zrobić to zakończyć połączenie i użyj fabryki DbConnection CreateCommand.

Podobnie jak w przypadku parametrów przejściowych, należy użyć podstawowych metod interfejsu i unikać takich rzeczy, jak SqlParameter, ponieważ nie są one zapakowane.

Więc:

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

nie testowałem DataSets i DataAdapters, szczerze używam Dapper dla tego rodzaju rzeczy w tych dniach, ponieważ jest o wiele mniej gadatliwy. Jeśli to się uda, pamiętaj, by zgłosić kod Google.

+0

Dapper był łatwiejszy tbh. Dzięki! – TodK

+0

Istnieje również klasa 'ProfiledDbDataAdapter', której można użyć do zawijania' SqlDataAdapter' z profilowaniem. Zobacz http://stackoverflow.com/a/13793409/8479 – Rory

3

Mam podobną sytuację, w której cały nasz SQL jest przechowywany w procedurach i po prostu mamy kod ADO.NET, który do nich woła. Mam również warstwę dostępu do danych, z której jestem zadowolony, więc nie podoba mi się pomysł przepisania jej na części, aby dostosować ją do MiniProfilera.

Więc kompromisem, na którym się zdecydowałem, było użycie standardowych połączeń MiniProfiler.Step() wokół wywołań procedur. Pomaga w moim przypadku, że wszystkie wywołania do ExecuteReader() i innych są częścią klasy bazowej, więc wiem, że wszystkie polecenia SqlCommands są wykonywane w ramach kilku podstawowych metod, więc łatwo było zmienić istniejący kod, aby wyglądał podobnie:

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; 
} 

Jestem pewien, że to nie jest tak dobre, jak odpowiedź Sama, bo jestem pewien, że niektórych szczegółów nie będzie w karcie wyników, ale działa to wystarczająco dobrze, żebym mógł analizować połączenia z bazami danych teraz z bardzo małymi zmianami w moim struktura kodu dostępu do danych.