ServiceStack OrmLite:捕获存储过程的Sql InfoMessage事件
用OrmLite捕获存储过程的SQL InfoMessage事件
嗨,这个问题我刚好有实践经验,咱们一步步来搞定用OrmLite捕获SQL InfoMessage事件的需求~
首先得明确:OrmLite本质是对ADO.NET连接的轻量级包装,所以要捕获InfoMessage事件,核心是拿到它背后的原生数据库连接,然后绑定对应的事件监听。
核心思路
不同数据库的原生连接类(比如SQL Server的SqlConnection、MySQL的MySqlConnection)都提供了InfoMessage事件,用来捕获存储过程中通过PRINT语句或者RAISERROR WITH NOWAIT输出的进度消息。我们需要从OrmLite的IDbConnection中拿到这个原生连接,再绑定事件处理逻辑。
具体实现步骤
1. 封装事件监听逻辑
先写一个通用的方法,用来给OrmLite连接绑定InfoMessage事件,避免重复代码:
private void SetupSqlInfoListener(IDbConnection db) { // 针对SQL Server的情况(如果是其他数据库,替换成对应的Connection类型) if (db.Connection is SqlConnection sqlConn) { // 先移除旧的事件绑定,防止重复触发 sqlConn.InfoMessage -= OnSqlInfoReceived; sqlConn.InfoMessage += OnSqlInfoReceived; } } private void OnSqlInfoReceived(object sender, SqlInfoMessageEventArgs e) { // 遍历所有收到的消息(可能一次返回多条) foreach (var error in e.Errors) { var progressMessage = $"存储过程执行进度:{error.Message}(行号:{error.LineNumber})"; // 这里替换成你的Slack通知逻辑 Console.WriteLine(progressMessage); SendProgressToSlack(progressMessage); } } // 示例Slack通知方法(你需要实现自己的逻辑) private void SendProgressToSlack(string message) { // 调用Slack API发送消息的代码 }
2. 在执行存储过程时绑定并使用
接下来,在你的控制台应用中,打开OrmLite连接,绑定事件,然后批量执行存储过程:
// 假设你已经初始化了OrmLite的DbFactory var dbFactory = new OrmLiteConnectionFactory("你的数据库连接字符串", SqlServerDialect.Provider); // 要执行的存储过程列表 var storedProcs = new List<string> { "Proc_UpdateUserStatus", "Proc_GenerateReports", "Proc_CleanupOldData" }; using (var db = dbFactory.Open()) { // 绑定InfoMessage事件监听 SetupSqlInfoListener(db); // 遍历执行每个存储过程 foreach (var procName in storedProcs) { Console.WriteLine($"开始执行存储过程:{procName}"); // 执行存储过程(如果需要传参,可以用db.ExecuteSql("EXEC @procName @param1", new { procName, param1 = value })) db.ExecuteSql($"EXEC {procName}"); } }
注意事项
- 数据库兼容性:如果是MySQL、PostgreSQL等其他数据库,只需要把
SqlConnection替换成对应的连接类(比如MySqlConnection),它们的InfoMessage事件用法基本一致。 - 事件重复绑定:如果你的连接是复用的(比如用连接池),一定要先移除旧的事件绑定再添加新的,避免同一个消息被多次处理。
- 消息内容:存储过程中需要用
PRINT或者RAISERROR('消息', 10, 1) WITH NOWAIT来输出实时进度,这样InfoMessage事件才能捕获到(普通的RAISERROR不会实时触发,需要WITH NOWAIT)。 - 连接生命周期:确保在连接打开后再绑定事件,OrmLite的
dbFactory.Open()会自动打开连接,所以在using块内绑定是安全的。
这样就能实时捕获存储过程的执行进度消息,再推送到Slack啦~
内容的提问来源于stack exchange,提问作者joh04667
相关产品推荐
相关产品推荐

