Можно ли использовать mvc-мини-профилировщик с наборами типизированных данных? - PullRequest
3 голосов
/ 18 ноября 2011

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

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

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 27 ноября 2011

Как отметил Дарин Димитров, на самом деле это невозможно. Вы можете изменить генератор кода, чтобы установить свойство Connection TableAdapter общедоступным, чтобы вы могли передавать свое собственное соединение. Но 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();
    } 
    

    Вот что вы получите: Basic timing information about your db call

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

  3. Попробуйте использовать Родинок для вставки профилирующих хуков в SqlConnection. Хорошо, не совсем серьезно по этому поводу ...

2 голосов
/ 21 ноября 2011

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

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

...