Можно ли использовать mvc-mini-profiler с типизированными наборами данных?

Я экспериментировал с использованием mvc-mini-profiler на веб-сайте ASP.NET. Все профилирование запросов работает отлично, но теперь я пытаюсь понять, есть ли способ подключить его к нашим вызовам базы данных.

Все вызовы нашей базы данных на нашем веб-сайте выполняются с использованием типизированных наборов данных (файлы .xsd) с адаптерами таблиц и таблиц запросов. Можно ли как-то подключить mvc-mini-profiler к этим датасетам?

Я понимаю, что обычно вы получаете какое-то dbconnection (SqlConnection и т. д.), а затем обертываете его ProfiledDbConnection профилировщика. Я просто не знаю, как это сделать с набором данных, это вообще возможно?

Примечание: переход с использования наборов данных на linq2sql или какой-либо другой способ на самом деле невозможен, поскольку это довольно большой проект, который существует уже некоторое время.

Пример вызова базы данных

DAL_ClientTableAdapters.ClientTableAdapter tba = new DAL_ClientTableAdapters.ClientTableAdapter();
DAL_Client.ClientDataTable dt = tba.GetData();

Где есть файл DAL_Client.xsd, содержащий адаптер таблицы с именем Client, который использует строку подключения, определенную в файле web.config.


person Bryan Denny    schedule 17.11.2011    source источник
comment
Как вы загружаете наборы данных — DataSet.Load? Откуда берется IDataReader - ваше собственное соединение с БД? Разве вы не можете просто использовать профилированное соединение для этого?   -  person Rup    schedule 21.11.2011
comment
Нет, есть файл .xsd. Я просто получаю данные следующим образом: DAL_ClientTableAdapters.ClientTableAdapter tba = new DAL_ClientTableAdapters.ClientTableAdapter(); DAL_Client.ClientDataTable dt = tba.GetData(); Это типизированный набор данных с подключением в строке подключения в файле web.config.   -  person Bryan Denny    schedule 21.11.2011
comment
@rup Обновленный вопрос с комментарием   -  person Bryan Denny    schedule 21.11.2011


Ответы (2)


Как отметил Дарин Димитров, на самом деле вы не можете этого сделать. Вы можете изменить генератор кода, чтобы сделать свойство TableAdapter Connection общедоступным, чтобы вы могли передать свое собственное соединение. Но SqlConnection — это закрытый класс, поэтому вы не можете расширить его, добавив к нему профилирующие крючки...

Возможные обходные пути:

  1. Вы можете получить базовую информацию о времени, добавив шаги профилирования вокруг ваших вызовов базы данных. Но вы не получаете специальной подсветки в пользовательском интерфейсе, общего времени SQL или подробностей о командах и параметрах запроса, как вы получаете для обычных вызовов базы данных. Если это важно, я думаю, вы могли бы расширить код минипрофилера, чтобы помочь с таймингами. Я думаю, что-то вроде этого:

    DAL_ClientTableAdapters.ClientTableAdapter tba = new DAL_ClientTableAdapters.ClientTableAdapter();
    DAL_Client.ClientDataTable dt = null;
    //if you are not familiar with miniprofiler Steps, this adds the elapsed time between the curly braces to your timing information
    using(MiniProfiler.StepStatic("Executing GetData() from 'Client' table")) {
        dt = tba.GetData();
    } 
    

    Вот что вы получите: Основная информация о времени вашего вызова БД

  2. Попробуйте изменить генератор кода, чтобы добавить DbConnection в сгенерированные файлы вместо SqlConnection. Не знаю, использует ли типизированный набор данных или ваш код что-то конкретное для SqlConnection, но звучит довольно рискованно для старого и большого проекта...

  3. Попробуйте использовать Moles для вставки ловушек профилирования в SqlConnection. Ладно, не совсем серьезно...

person Akos Lukacs    schedule 27.11.2011
comment
Обтекание вызовов базы данных для получения их времени выглядит как лучший обходной подход, пока мы не преобразуем эти типизированные наборы данных в linq2sql. Спасибо! - person Bryan Denny; 28.11.2011

Насколько я знаю, этот сценарий не поддерживается. Когда вы создаете строго типизированный адаптер таблицы, конструктор Visual Studio автоматически создает классы, для которых используются определенные классы доступа к данным: SqlConnection, SqlCommand, ... Способ работы мини-профилировщика заключается в том, что он упаковывает фактическое базовое соединение в ProfiledDbConnection. Этот класс является производным от DbConnection, и вы не можете передать его адаптеру таблицы, поскольку он зависит от SqlConnection.

Мини-профилировщик можно использовать с уровнями доступа к данным, которые не полагаются на жестко закодированную конкретную реализацию DbConnection, а работают с абстракциями и поставщиками.

person Darin Dimitrov    schedule 21.11.2011
comment
Спасибо за информацию, я подумал, что это не совсем возможно, но хотел спросить на всякий случай, если я что-то упускаю из виду. - person Bryan Denny; 28.11.2011