Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Thực thi các câu lệnh chuẩn bị do NHibernate tạo trong SQL Server Management Studio

Tôi biết bạn có thể làm điều này với nhibernate profiler nhưng đây không phải là một công cụ miễn phí. Tôi cũng muốn có một giải pháp thay thế miễn phí để thực hiện việc này.

http://nhprof.com/

Chỉnh sửa

Có vẻ như có một appender tùy chỉnh dành cho log4net sẽ định dạng nó để bạn thực sự có thể chạy các spits sql NHibernate. Tôi đã thấy nó trong blog được liệt kê bên dưới:

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

Dưới đây là mã tôi đã lấy từ blog trên và được sửa đổi để hoạt động với 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();
    }
}

Đây là cách bạn gửi kết quả này tới bảng điều khiển:

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

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

LƯU Ý:

Có vẻ như điều này gây ra một số vấn đề về hiệu suất khá quan trọng trong hệ thống sản xuất. Tôi chưa tìm ra cách tốt hơn để thực hiện việc này nhưng đối với bất kỳ ai sử dụng ứng dụng này, hãy cẩn thận với những vấn đề về hiệu suất này



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Định dạng nguồn SSIS Chuyển đổi ngầm định cho ngày giờ

  2. Kết hợp các hàng kết quả được truy vấn theo số nhận dạng duy nhất?

  3. Cách hoạt động của hàm SOUNDEX () SQL Server

  4. Sử dụng cơ sở dữ liệu bên trong một thủ tục được lưu trữ

  5. Sắp xếp phức tạp của chuỗi trường - số - chuỗi