栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在SQL Server Management Studio中执行NHibernate生成的准备好的语句

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在SQL Server Management Studio中执行NHibernate生成的准备好的语句

我知道您可以使用nhibernate profiler来执行此操作,但这不是免费的工具。我也将对实现此目的的免费替代方法感兴趣。

http://nhprof.com/

编辑

看起来那里有一个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, @"commandsd+:"); 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, @"@pd+(?=[,);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>

笔记:

看来这会在生产系统中引起一些相当严重的性能问题。我还没有找到更好的方法来执行此操作,但是对于使用此方法的任何人,请注意这些性能问题



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/670310.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号