Использование mvc-mini-profiler с ADO.NET SqlConnection

Я пытаюсь использовать (потрясающий) mvc-mini-profiler с некоторым уже существующим кодом хранимой процедуры SqlConnection (мы не используем EF или L2S, только ADO.NET для SQL Server 2008). Я ищу руководство о том, как интегрировать унаследованные типы ProfiledDb в такой код.

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, была бы отличной, потому что на первый взгляд кажется, что профилировщик SQL должен быть применим к этой ситуации.


person TodK    schedule 27.06.2011    source источник
comment
Основываясь на отзывах Сэма ниже, я просто внедрил вместо этого Dapper и сократил 50 строк кода до 20, что значительно уменьшило сложность. Мне удалось реализовать решение для SqlDataReaders, используя DbDataReader и DbType.Guid для набора параметров (заменив все биты, специфичные для MS SQL, эквивалентом System.Data.Common). Как упомянул Сэм, это намного более многословно, и в конечном итоге вы пишете много шаблонного кода, и вам может быть лучше (imo) реализовать Dapper, чем пытаться втиснуть его в существующий SqlDataAdapter.   -  person TodK    schedule 29.06.2011


Ответы (2)


Вам нужно будет завершить соединение и использовать фабрику DbConnection CreateCommand.

Точно так же для передачи параметров вам нужно будет использовать методы базового интерфейса и избегать таких вещей, как SqlParameter, потому что они не упакованы.

So:

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

Я не тестировал DataSets и DataAdapters, честно говоря, в последнее время я использую Dapper для таких вещей, так как он гораздо менее многословен. Если это сработает, обязательно сообщите о коде Google.

person Sam Saffron    schedule 28.06.2011
comment
Dapper было проще, ТБХ. Спасибо! - person TodK; 29.06.2011
comment
Также есть класс ProfiledDbDataAdapter, который можно использовать для обертывания SqlDataAdapter профилированием. См. stackoverflow.com/a/13793409/8479. - person Rory; 10.12.2012

У меня похожая ситуация, когда весь наш SQL находится в хранимых процедурах, а у нас просто есть код ADO.NET, который их вызывает. У меня также есть уровень доступа к данным, которым я доволен, поэтому мне не нравится идея переписывать его фрагменты просто для того, чтобы приспособить MiniProfiler.

Таким образом, компромисс, на котором я остановился, состоял в том, чтобы использовать стандартные вызовы 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;
}

Я уверен, что это не так хорошо, как ответ Сэма, поскольку я уверен, что некоторые детали будут отсутствовать на вкладке результатов, но он работает достаточно хорошо, чтобы я мог анализировать вызовы базы данных сейчас с очень небольшими изменениями в моем коде доступа к данным. структура.

person Peter Monks    schedule 25.04.2012