sql >> Database teknologi >  >> RDS >> Sqlserver

Udfør NHibernate-genererede forberedte sætninger i SQL Server Management Studio

Jeg ved, at du kan gøre dette med nhibernate profiler, men dette er ikke et gratis værktøj. Jeg ville også være interesseret i et gratis alternativ til at gøre dette.

http://nhprof.com/

Rediger

Det ser ud til, at der er en brugerdefineret appender derude til log4net, der vil formatere den, så du faktisk kan køre sql NHibernate spytter ud. Jeg så det i bloggen nedenfor:

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

Nedenfor er koden, jeg har taget fra ovenstående blog og ændret til at fungere med 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();
    }
}

Sådan sender du dette output til konsollen:

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

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

BEMÆRK:

Det ser ud til, at dette forårsager nogle ret betydelige ydeevneproblemer i et produktionssystem. Jeg har ikke fundet en bedre måde at gøre dette på endnu, men for alle, der bruger dette, pas på disse præstationsproblemer



  1. Har du brug for to indekser på en HABTM join-tabel?

  2. funktion bind_param() på et ikke-objekt i min nye kode

  3. JSON_INSERT() vs JSON_SET() vs JSON_REPLACE() i SQLite

  4. Spring Boot CRUD Eksempel med MySQL