【问题标题】:Servicestack OrmLite: Capture PRINT statements from stored procedureServicestack OrmLite:从存储过程中捕获 PRINT 语句
【发布时间】:2018-04-12 21:27:13
【问题描述】:

我目前正在编写一个控制台应用程序,它在我们的 (Sql Server) 数据库中启动许多存储过程。该应用程序主要负责执行过程,将事件记录到许多地方,然后进行一些任意工作。我们有一个很好的 Data NuGet 包,它与 OrmLite / ServiceStack 集成,所以我在这里也尝试使用 OrmLite 作为我们的 ORM。

应用程序本身只接受包含存储过程名称的输入,我根据该(字符串)名称执行它们。存储过程本身只是移动数据;应用不需要知道数据库模型(也不能;模型可以改变)。

由于这些 sprocs 做了很多工作,sprocs 本身通过 PRINT 语句输出日志记录。我的目标是在控制台应用程序的日志记录中包含这些 PRINTed 日志消息。

是否可以从DbConnection 命令捕获PRINT 消息?我无法通过内置命令找到任何方法来捕获它;只有错误。我必须使用ExecuteReader() 来获取DataReader 并以这种方式阅读吗?

感谢任何帮助。谢谢!

【问题讨论】:

    标签: servicestack sqldatareader ormlite-servicestack


    【解决方案1】:

    启用调试日志

    如果您使用debug enabled logger 配置 ServiceStack,它会将生成的 SQL + 参数记录到配置的记录器中。

    因此您可以使用StringBuilderLogFactory 将调试日志记录到字符串中。

    CaptureSqlFilter

    OrmLite 确实有一个功能,您可以使用CaptureSqlFilter 捕获命令的 SQL 输出:

    using (var captured = new CaptureSqlFilter())
    using (var db = OpenDbConnection())
    {
        db.Where<Person>(new { Age = 27 });
    
        captured.SqlStatements[0].PrintDump();
    }
    

    但这并不执行语句,它只是捕获它。

    自定义执行过滤器

    您可能会使用Custom Exec Filter 来执行命令并调用自定义函数:

    public class CaptureOrmLiteExecFilter : OrmLiteExecFilter
    {
        public override T Exec<T>(IDbConnection dbConn, Func<IDbCommand, T> filter)
        {
            var holdProvider = OrmLiteConfig.DialectProvider;
            var dbCmd = CreateCommand(dbConn);
            try
            {
                return filter(dbCmd);
            }
            finally
            {
                MyLog(dbCmd);
                DisposeCommand(dbCmd);
                OrmLiteConfig.DialectProvider = holdProvider;
            }
        }
    }
    
    //Configure OrmLite to use above Exec filter
    OrmLiteConfig.ExecFilter = new CaptureOrmLiteExecFilter();
    

    【讨论】:

    • 太棒了。感谢您如此参与社区,mythz!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    相关资源
    最近更新 更多