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

如何在C#中检测是否可使用Context Connection(进程内连接)

如何判断C#代码是否在SQL Server CLR环境中运行(安全检测Context Connection可用性)

嘿,这个需求很实际——毕竟没人想在非SQL Server环境里调用Context Connection时平白抛出NotSupportedException。我给你推荐最优且最安全的方案,完全符合你的要求:

核心方案:使用SqlContext.IsAvailable静态属性

SQL Server CLR集成提供了System.Data.SqlClient.SqlContext类,它的IsAvailable只读静态属性就是专门用来检测当前代码是否运行在SQL Server进程内的。这个方法不会抛出任何异常,在非SQL环境下直接返回false,完美规避了你担心的问题。

检测方法代码示例

using System.Data.SqlClient;

public static class EnvironmentDetector
{
    /// <summary>
    /// 判断当前代码是否运行在SQL Server CLR集成环境中
    /// </summary>
    /// <returns>如果在SQL进程内返回true,否则返回false</returns>
    public static bool IsRunningInSqlClr()
    {
        // 这是官方推荐的标准检测方式,无异常、高性能
        return SqlContext.IsAvailable;
    }
}

结合业务逻辑的完整示例

比如你要实现异常时写入日志表的逻辑,可以这样写:

public static void RecordException(Exception ex)
{
    if (EnvironmentDetector.IsRunningInSqlClr())
    {
        // 在SQL CLR环境内,安全使用Context Connection
        using (var conn = new SqlConnection("context connection=true"))
        {
            conn.Open();
            string insertLogSql = @"
                INSERT INTO ErrorLogs 
                (ExceptionMessage, StackTrace, LogTime)
                VALUES (@msg, @stack, GETDATE())";
            
            using (var cmd = new SqlCommand(insertLogSql, conn))
            {
                cmd.Parameters.AddWithValue("@msg", ex.Message);
                cmd.Parameters.AddWithValue("@stack", ex.StackTrace);
                cmd.ExecuteNonQuery();
            }
        }
    }
    else
    {
        // 非SQL环境,切换到其他日志方式(比如控制台、文件日志等)
        Console.WriteLine($"[Non-SQL Env] Exception: {ex.Message}\nStackTrace: {ex.StackTrace}");
    }
}

为什么不推荐try-catch方案?

可能有人会想到尝试打开Context Connection然后捕获NotSupportedException,但这种做法有两个明显的缺点:

  • 性能开销大:异常处理本身是昂贵的操作,不应该用它来做流程控制。
  • 代码不优雅:用异常来判断环境属于反模式,可读性和维护性都很差。

而SqlContext.IsAvailable是专门为这个场景设计的,既高效又清晰,完全没有这些问题。

补充说明

只要SqlContext.IsAvailable返回true,就说明Context Connection一定可以正常使用——SQL Server会保证在CLR集成环境内这个连接的可用性,不需要额外做连接测试。

内容的提问来源于stack exchange,提问作者UlfL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:34:03