当前位置: 首页 > 面试题库 >

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

云卓
2023-03-14
问题内容

将NHibernate配置为显示执行的SQL可以完成预期的工作,但是每当需要将SQL字符串复制粘贴到SQL Server Management
Studio中时,为了使其兼容,我们都必须对其进行重新排列。

在开始开发自己的应用程序以将其解析并重新排列为对ManagementStudio更友好的SQL之前,我想重申一下以前从未做过的事情-
我不愿意花时间在此上,以后再查找。

是否有一种廉价且实用的方法将NH生成的准备好的语句转换为可以立即执行的内容?

提前致谢


问题答案:

我知道您可以使用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, @"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中检索name2),但是我还需要检索具有相同名字的人的状态(在本例中是statusY)。注意,对于name2的检索,我不能依赖于json对象的索引(name2可能是json对象的第一个键)。 到目前为止,我将如何做到这一点:A)在第一个查询中从表1中获取name2),对其进行清理,以及B)在第二个查询中使用它,然后正确地检索状态 语句A)和B)都是参数化的准备好的sql语句

  • 场景:继我之前的问题(在存储过程中使用游标循环行MySQL)之后,我尝试执行一个嵌套的prepare语句,在该语句中,我向外部语句输入一个日期,然后调用内部语句,该语句从表中获取数据。 代码: 问题:这段代码运行时没有错误,但没有给出任何结果。如果我只运行第一个准备好的语句,一个接一个地直接输入变量,就可以了。所以我猜问题在于我的第二句话。 问题:你知道我做错了什么吗? Obs:第二个代码应该循环

  • 我有以下准备的一个准备好的声明失败了... 我在我的第一份准备好的声明中几乎有同样的准备,而且它进行得很好。我不确定是否我有两个准备好的声明,如果这是造成一个问题,或情况可能是什么? 现在我有个错误... 更新-可能的内部连接,像这样?

  • 我一直在阅读有关SQL注入的文章,并决定修改我的代码以防止SQL注入。 例如,我有一个输入,我将值插入到我的数据库中。最初,我对注射的警惕是这样的: 在我读过的文章中,有人建议应该使用预准备语句。我更改了我的代码并使用了它: 虽然这可以防止SQL注入,但它不会对XSS做任何事情。所以我决定修改(并使用它来防止脚本注入。 现在,我的问题是如何使用预先准备好的语句。我将插入三个项目;艺术家、专辑和歌曲

  • 问题内容: 我刚刚开始做我的第一个项目(很有趣)。我正在学习PHP和MySQL,并且已经完成了我的第一个正常工作的应用程序。它可以工作,但是我现在正在学习如何保护应用程序的安全,从而防止SQL注入。我大约有50多个PHP文件来管理与MySQL数据库的交互。它们看起来都是这样的: 这是我在整个应用程序中用于向数据库读写数据的格式。如果我需要将它们更改为准备好的语句,而不是在其中插入任何信息,而只是在