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



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

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

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

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

任何帮助,不胜感激。谢谢!

启用调试

日志记录

如果使用启用了调试的记录器配置 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();
}

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

自定义执行筛选器

您可以使用自定义执行筛选器来执行命令并调用自定义函数:

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();

相关内容

  • 没有找到相关文章

最新更新