尽管根本原因不是Dapper,但有一个潜在的异常正在被吞噬。
使用 ADO.Net 代码,例如:
var geometry = Util.CreateSqlGeometry();
SqlDataReader reader=null;
SqlCommand cmd=null;
try
{
cmd = new SqlCommand("dbo.SelectSqlGeometry", (SqlConnection)Connection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@x", geometry) { UdtTypeName = "Geometry" });
cmd.ExecuteNonQuery();
reader = cmd.ExecuteReader();
while (reader.Read())
{
var y = (SqlGeometry)reader.GetValue(0);
var same = geometry.STEquals(y);
}
reader.Dispose();
reader = null;
}
finally
{
if (reader != null)
{
if (!reader.IsClosed) try { cmd.Cancel(); }
catch {}
reader.Dispose();
}
if (cmd != null) cmd.Dispose();
Connection.Close();
}
抛出以下异常reader.GetValue
System.InvalidCastException 未处理 HResult=-2147467262
Message=[A]Microsoft.SqlServer.Types.SqlGeometry 无法转换为
[B]Microsoft.SqlServer.Types.SqlGeometry。 A型起源于
'Microsoft.SqlServer.Types,版本=10.0.0.0,文化=中性,
PublicKeyToken=89845dcd8080cc91' 在位置上下文“默认”中
'C:\ Windows \ assembly \ GAC_MSIL \ Microsoft.SqlServer.Types \ 10.0.0.0__89845dcd8080cc91 \ Microsoft.SqlServer.Types.dll'。
类型 B 源自 'Microsoft.SqlServer.Types,版本=11.0.0.0,
上下文中文化=中立,PublicKeyToken=89845dcd8080cc91'
位置的“默认”
'C:\ Windows \ assembly \ GAC_MSIL \ Microsoft.SqlServer.Types \ 11.0.0.0__89845dcd8080cc91 \ Microsoft.SqlServer.Types.dll'。
来源=DynamicGeometryIssue StackTrace:
在 c:\Users\rich\Documents\Visual Studio 中的 DynamicGeometryIssue.TestDao.TestGeometry() 处
2013\Projects\DynamicGeometryIssue\DynamicGeometryIssue\TestDao.cs:行
27 号
在 c:\Users\rich\Documents\Visual Studio 中的 DynamicGeometryIssue.Program.Main(String[] args)
2013\Projects\DynamicGeometryIssue\DynamicGeometryIssue\Program.cs:行
15
在 System.AppDomain._nExecuteAssembly(RuntimeAssembly 程序集,String[] args)
在 System.AppDomain.ExecuteAssembly(字符串 assemblyFile,证据 assemblySecurity,字符串 [] args)
在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
在 System.Threading.ThreadHelper.ThreadStart_Context(对象状态)
在 System.Threading.ExecutionContext.RunInternal(ExecutionContext
executionContext、ContextCallback 回调、对象状态、布尔值
保留SyncCtx)
在 System.Threading.ExecutionContext.Run(ExecutionContextexecutionContext,ContextCallback 回调,对象状态,布尔值
保留SyncCtx)
在 System.Threading.ExecutionContext.Run(ExecutionContextexecutionContext,ContextCallback 回调,对象状态)
在 System.Threading.ThreadHelper.ThreadStart() 内部异常:
底层异常的原因是 SQL Server 2012 中的已知重大更改。请参阅SQL CLR 数据类型以下 MSDN 文档的部分
http://msdn.microsoft.com/en-us/library/ms143179(v=sql.110).aspx http://msdn.microsoft.com/en-us/library/ms143179(v=sql.110).aspx
对我有用的解决方案是在 app.config 或 web.config 中创建以下绑定重定向。
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.SqlServer.Types"
publicKeyToken="89845dcd8080cc91"
culture="neutral" />
<bindingRedirect oldVersion="10.0.0.0"
newVersion="11.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
或者,使用 .NET 4.5,您可以更改连接字符串以包含“类型系统版本”属性的值“SQL Server 2012”,以强制 SqlClient 加载程序集的版本 11.0。
另一种解决方法是代码如下:
var geo = SqlGeography.Deserialize(rdr.GetSqlBytes(0));
然而,我不认为这对 Dapper 来说是一个选择。