Servicestack OrmLite:从存储过程捕获PRINT语句

时间:2018-04-12 21:27:13

标签: servicestack sqldatareader ormlite-servicestack

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

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

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

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

感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

启用调试日志记录

如果使用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();