You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:48:32