Замок ActiveRecord: Какой самый простой способ увидеть SQL? - PullRequest
1 голос
/ 11 июля 2011

Я пытаюсь заставить Castle ActiveRecord показать мне SQL, который он генерирует. Различные блоги, которые я нашел по этому поводу, дают две альтернативы:

(1) Использовать настройку NHibernate "show_sql" . Беда в том, что я использую программную настройку, вот так.

var config = XmlConfigurationSource.Build(
    DatabaseType.MsSqlServer2008, Settings.Default.StationManagerDbConnectionString);
config.IsRunningInWebApp = isRunningInWebApp;
config.PluralizeTableNames = true;
var modelAssembly = Assembly.GetAssembly(typeof(OneOfMyClasses));
ActiveRecordStarter.Initialize(modelAssembly, config);

В программной конфигурации, похоже, нет способа указать "show_sql".

(2) Использовать log4net . Но, оставив в стороне то, что боль в log4net - работать, я не нашел способа получить просто SQL. Я получаю кучу и кучу отладочных данных, из которых операторы SQL являются лишь небольшой частью.

Итак: есть ли способ сохранить мою программную конфигурацию Castle ActiveRecord, но также заставить NHibernate выводить только SQL?

РЕДАКТИРОВАТЬ: Вот что я получил для работы с log4net. Но на первых двух страницах моего веб-приложения в окне «Отладка» выпадает более 14 000 строк. Как мне изменить этот код, чтобы получить только SQL?

var appender = new log4net.Appender.DebugAppender
{
    Layout = new log4net.Layout.SimpleLayout(),
    Name = "NHibernate.SQL",
    Threshold = log4net.Core.Level.Debug
};
log4net.Config.BasicConfigurator.Configure(appender);

Ответы [ 2 ]

1 голос
/ 11 июля 2011

Вы должны иметь возможность просто отделить sql, используя NHibernate.SQL logger.

Пример конфигурации:

<log4net>
<!-- This is a default logger that nhibernate uses to push out all the SQL statements to-->
<logger name="NHibernate.SQL" additivity="false">
  <level value="DEBUG"/>
  <appender-ref ref="NHibernateSQLLog"/>
</logger>

<!-- This is a default logger that nhibernate uses to push out all the debugging type information to-->
<logger name="NHibernate" additivity="false">
  <level value="DEBUG"/>
  <appender-ref ref="NHibernateFileLog"/>
</logger>

<appender name="NHibernateFileLog" type="log4net.Appender.RollingFileAppender">
  <file value="Logs/nhibernate.txt" />
  <appendToFile value="true" />
  <rollingStyle value="Size" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="10MB" />
  <staticLogFileName value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%d{HH:mm:ss.fff} [%t] %-5p %c - %m%n"  />
  </layout>
</appender>

<appender name="NHibernateSQLLog" type="log4net.Appender.RollingFileAppender">
  <file value="Logs/nhibernate_sql.txt" />
  <appendToFile value="true" />
  <rollingStyle value="Size" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="10MB" />
  <staticLogFileName value="true" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%d{HH:mm:ss.fff} [%t] %-5p %c - %m%n"  />
  </layout>
 </appender>
 </log4net>

Редактировать:

var filter = new log4net.Filter.LoggerMatchFilter();
filter.LoggerToMatch = "NHibernate.SQL";
filter.AcceptOnMatch = true;

var filterDeny = new log4net.Filter.DenyAllFilter();

var appender = new log4net.Appender.DebugAppender
{
    Layout = new log4net.Layout.SimpleLayout(),
    Name = "NHibernate.SQL",
    Threshold = log4net.Core.Level.Debug
};

appender.AddFilter(filter);
appender.AddFilter(filterDeny);
log4net.Config.BasicConfigurator.Configure(appender);
0 голосов
/ 11 июля 2011

Самый лучший инструмент для этой задачи - это NHibernate Profiler (http://nhprof.com/).Это коммерческое приложение, но вы получаете 30-дневную бесплатную пробную версию.

...