Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wykonywanie przygotowanych instrukcji generowanych przez NHibernate w SQL Server Management Studio

Wiem, że możesz to zrobić za pomocą nhibernate profilera, ale nie jest to darmowe narzędzie. Byłbym również zainteresowany darmową alternatywą dla tego.

http://nhprof.com/

Edytuj

Wygląda na to, że istnieje niestandardowy appender dla log4net, który sformatuje go tak, że można faktycznie uruchomić wypluwanie sql NHibernate. Widziałem to na poniższym blogu:

http://gedgei.wordpress.com/ 2011/09/03/rejestrowanie-nhibernacji-zapytań-z-parametrami/

Poniżej znajduje się kod, który wziąłem z powyższego bloga i zmodyfikowałem do pracy z przewodnikami:

/// <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();
    }
}

Oto jak możesz wysłać to wyjście do konsoli:

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

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

UWAGA:

Wygląda na to, że powoduje to dość poważne problemy z wydajnością w systemie produkcyjnym. Nie znalazłem jeszcze lepszego sposobu, aby to zrobić, ale każdy, kto z tego korzysta, uważaj na te problemy z wydajnością



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Procesor kwerend nie może utworzyć planu kwerendy z powodu wskazówek zdefiniowanych w tej kwerendzie. Wyślij zapytanie ponownie i bez użycia SET FORCEPLAN

  2. Zakres zmiennych, które są zdefiniowane w ramach bloku while w procedurach składowanych - SQL Server

  3. Optymalizacja zapytań SQL:najlepsze praktyki zwiększające wydajność

  4. jak skonfigurować maksymalne wykorzystanie pamięci SQL Server

  5. JDBC SQLServerException:Ten sterownik nie jest skonfigurowany do zintegrowanego uwierzytelniania.