Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Изпълнете генерирани от NHibernate подготвени отчети в SQL Server Management Studio

Знам, че можете да направите това с nhibernate Profiler, но това не е безплатен инструмент. Бих се интересувал и от безплатна алтернатива за това.

http://nhprof.com/

Редактиране

Изглежда, че има персонализиран appender за log4net, който ще го форматира така, че всъщност да можете да стартирате sql, който NHibernate изплюва. Видях го в блога, посочен по-долу:

http://gedgei.wordpress.com/ 2011/09/03/logging-nhibernate-queries-with-parameters/

По-долу е кодът, който взех от горния блог и модифицирах, за да работи с Guids:

/// <summary>
/// This log4net appender is used for outputting NHibernate sql statements in a sql management studio friendly format.
/// This means you should be able to copy the sql output from this appender and run it directly.  Normally in the NHibernate
/// output there is parameterized sql that must be manually edited to run it.
/// </summary>
public class NHibernateSqlAppender : ForwardingAppender
{
    private const string GuidRegex = @"\b[A-F0-9]{8}(?:-[A-F0-9]{4}){3}-[A-F0-9]{12}\b";

    protected override void Append(LoggingEvent loggingEvent)
    {
        var loggingEventData = loggingEvent.GetLoggingEventData();

        if (loggingEventData.Message.Contains("@p"))
        {
            StringBuilder messageBuilder = new StringBuilder();

            string message = loggingEventData.Message;
            var queries = Regex.Split(message, @"command\s\d+:");

            foreach (var query in queries)
                messageBuilder.Append(ReplaceQueryParametersWithValues(query));

            loggingEventData.Message = messageBuilder.ToString();
        }

        base.Append(new LoggingEvent(loggingEventData));
    }

    public static string ReplaceQueryParametersWithValues(string query)
    {
        string returnQuery = Regex.Replace(query, @"@p\d+(?=[,);\s])(?!\s*=)", match =>
        {
            Regex parameterValueRegex = new Regex(string.Format(@".*{0}\s*=\s*(.*?)\s*[\[].*", match));
            return parameterValueRegex.Match(query).Groups[1].ToString();
        });

        //Place single quotes around all Guids in the sql string
        returnQuery = Regex.Replace(returnQuery, GuidRegex, "'$0'", RegexOptions.IgnoreCase);

        int parameterListIndex = returnQuery.LastIndexOf("@p0");

        if (parameterListIndex != -1)
        {
            //Truncate the paramter list off the end since we are substituting the actual values in the regular expression above
            //The -1 also cuts off the semicolon at the end
            return returnQuery.Substring(0, parameterListIndex).Trim();
        }

        return returnQuery.Trim();
    }
}

Ето как бихте изпратили този изход към конзолата:

<appender name="NHibernateSqlAppender" type="NHibernatePlayground.Custom.NHibernateSqlAppender, NHibernatePlayground">
    <appender-ref ref="console" />
</appender>

<root>
    <appender-ref ref="NHibernateSqlAppender" />
</root>

ЗАБЕЛЕЖКА:

Изглежда, че това причинява някои доста значителни проблеми с производителността в производствена система. Все още не съм намерил по-добър начин да направя това, но за всеки, който използва това, внимавайте с тези проблеми с производителността



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Опитайте се да създадете таблица от Select - SqL Server 2008 извежда грешка

  2. Проверете за неуспешен имейл в SQL Server (T-SQL)

  3. SQL заявка, която получава всички пощенски кодове (адреси) в радиус от 20 мили от даден пощенски код

  4. Как да зададете име на първичен ключ в EF-Code-First

  5. Каква е паролата по подразбиране за SQL Server 2012, ако не съм поставил парола в настройката?