ags*_*udy 9 c# sql-server mono sqlclient
我想在mono下运行这个功能(我目前的版本是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);
}
Run Code Online (Sandbox Code Playgroud)
但它失败了,错误:
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?
Run Code Online (Sandbox Code Playgroud)
Mono相当于ClientConnectionId什么?或者我该如何解决?
ClientConnectionId未在 Mono SqlConnection类中实现。如果您确实希望每个实例都有一些唯一的标识符,您可以自己做,因为有一个由哈希码构造的 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
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以在你的方法中使用它:
if (prop == "ClientConnectionId")
{
return _conn.GetClientConnectionId();
}
Run Code Online (Sandbox Code Playgroud)
哈希码可以在不同时间点针对 2 个不同实例重复。
__MonoCS__仅由 mono 编译器定义。ClientConnectionIdMono 编译器看不到调用该属性的部分,对于其他部分和 .net 编译器来说反之亦然。
另一个解决方案是子类化SqlConnection并实现ClientConnectionId,但它是密封的......而且这还需要子类化一些SqlConnection在内部实例化该类的其他类。
| 归档时间: |
|
| 查看次数: |
288 次 |
| 最近记录: |