Servicestack OrmLite:从存储过程中捕获 PRINT 语句
Servicestack OrmLite: Capture PRINT statements from stored procedure
我目前正在编写一个控制台应用程序,用于启动我们(Sql 服务器)数据库中的许多存储过程。该应用程序主要负责执行程序,将事件记录到多个位置,然后进行一些任意工作。我们有一个很好的 Data NuGet 包,它与 OrmLite / ServiceStack 集成,所以我在这里也尝试使用 OrmLite 作为我们的 ORM。
应用程序本身只接受包含存储过程名称的输入,我正在根据该(字符串)名称执行它们。存储过程本身只是移动数据;应用程序不需要知道数据库模型(也不能;模型可以更改)。
由于这些 sprocs 做了很多工作,sprocs 本身通过 PRINT
语句输出日志记录。我的目标是将这些 PRINT
ed 日志消息包含在控制台应用程序的日志记录中。
是否可以从 DbConnection
命令捕获 PRINT
消息?我无法通过内置命令找到任何方法来捕获它;只有错误。我是否必须使用 ExecuteReader()
来获取 DataReader
并以这种方式阅读它们?
感谢任何帮助。谢谢!
启用调试日志记录
如果您使用 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();
我目前正在编写一个控制台应用程序,用于启动我们(Sql 服务器)数据库中的许多存储过程。该应用程序主要负责执行程序,将事件记录到多个位置,然后进行一些任意工作。我们有一个很好的 Data NuGet 包,它与 OrmLite / ServiceStack 集成,所以我在这里也尝试使用 OrmLite 作为我们的 ORM。
应用程序本身只接受包含存储过程名称的输入,我正在根据该(字符串)名称执行它们。存储过程本身只是移动数据;应用程序不需要知道数据库模型(也不能;模型可以更改)。
由于这些 sprocs 做了很多工作,sprocs 本身通过 PRINT
语句输出日志记录。我的目标是将这些 PRINT
ed 日志消息包含在控制台应用程序的日志记录中。
是否可以从 DbConnection
命令捕获 PRINT
消息?我无法通过内置命令找到任何方法来捕获它;只有错误。我是否必须使用 ExecuteReader()
来获取 DataReader
并以这种方式阅读它们?
感谢任何帮助。谢谢!
启用调试日志记录
如果您使用 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();