c# - ClientConnectionId 的单声道等效项

标签 c# sql-server mono sqlclient

我想在单声道下运行这个功能(我当前的版本是 4.0.2)

 public Object GetConnectionProperty(SqlConnection _conn, string prop)
    {
        if (_conn.State == ConnectionState.Closed &
            prop == "ServerVersion")
            return string.Empty;

        if (prop == "ClientConnectionId")
        {
            Guid guid = _conn.ClientConnectionId;
            return guid.ToString();
        }
        return _conn.GetType().GetProperty(prop).GetValue(_conn);
    }

但它失败并出现错误:

error CS1061: Type `System.Data.SqlClient.SqlConnection' does not contain a 
definition for `ClientConnectionId' and no extension method 
`ClientConnectionId' of type `System.Data.SqlClient.SqlConnection' could be 
found. Are you missing an assembly reference?

ClientConnectionId 的 Mono 等价物是什么?或者我该如何解决?

最佳答案

ClientConnectionId 未在单声道中实现 SqlConnection类(class)。如果你真的想为每个实例都有一些唯一的标识符,你可以自己做,例如从哈希码构造一个 id:

public static class SqlClientExtensions {
#if __MonoCS__
    private static Dictionary<int, string> _connIds = new Dictionary<int, string>();
#endif

    public static string GetClientConnectionId(this SqlConnection conn) {
        if(conn == null) {
            return Guid.Empty.ToString();
        }

#if __MonoCS__
        if(!connIds.ContainsKey(conn.GetHashCode())) {
            connIds.Add(conn.GetHashCode(), Guid.NewGuid().ToString());
        }

        return connIds[conn.GetHashCode()];
#else
        return conn.ClientConnectionId.ToString();
#endif
    }
}

然后你可以在你的方法中使用它:

if (prop == "ClientConnectionId")
{
    return _conn.GetClientConnectionId();
}

附言:

哈希码可能会在不同的时间点针对 2 个不同的实例重复。

附言 (2):

__MonoCS__ 仅由单声道编译器定义。调用 ClientConnectionId 属性的部分将不会被单声道编译器看到,反之亦然,另一部分和 .net 编译器。

附言 (3):

另一种解决方案是子类化 SqlConnection 并实现 ClientConnectionId 但它是密封的......而且这还需要子类化一些其他实例化 SqlConnection 内部类。

关于c# - ClientConnectionId 的单声道等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31354064/

相关文章:

c# - 通过 Linux 和 Mono 为 Windows 编写 .NET

c# - 如何让 HttpWebRequest 尽可能同步运行?

c# - Rhino 模拟单元测试(父类不包含带 0 个参数的构造函数)

c# - 如何显示Bfs的路径?

sql-server - 在 Sql Geography 列或更简单的列中存储 Long/Lat?

c# - 用 Mono 编译 IronPython

c# - 的正确名称是什么??运算符(operator)?

sql-server - 在 Microsoft Reporting Services 中向 Excel 报告添加和命名 TABS

sql - 便宜地缩放 : MySQL and MS SQL

linux - XGrabKey 不工作