sql >> Database >  >> RDS >> Sqlserver

Door NHibernate gegenereerde voorbereide instructies uitvoeren in SQL Server Management Studio

Ik weet dat je dit kunt doen met nhibernate profiler, maar dit is geen gratis tool. Ik zou ook geïnteresseerd zijn in een gratis alternatief hiervoor.

http://nhprof.com/

Bewerken

Het lijkt erop dat er een aangepaste appender is voor log4net die het zodanig formatteert dat je de sql NHibernate uitspuugt. Ik zag het in de onderstaande blog:

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

Hieronder staat de code die ik van de bovenstaande blog heb overgenomen en aangepast om met Guids te werken:

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

Hier is hoe u deze uitvoer naar de console zou sturen:

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

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

OPMERKING:

Het lijkt erop dat dit een aantal vrij significante prestatieproblemen veroorzaakt in een productiesysteem. Ik heb nog geen betere manier gevonden om dit te doen, maar voor iedereen die dit gebruikt, pas op voor deze prestatieproblemen



  1. Schemawijzigingen in MySQL en MariaDB op een veilige manier uitvoeren

  2. Hoe de lengte van een string in mysql te vergroten tijdens het toewijzen met behulp van JPA

  3. Versleuteling binnen orakel

  4. ORA-29908:ontbrekende primaire aanroep voor hulpoperator