从 DataReader 检索 SqlGeography 类型时如何解决 InvalidCastException?
Posted
技术标签:
【中文标题】从 DataReader 检索 SqlGeography 类型时如何解决 InvalidCastException?【英文标题】:How to resolve an InvalidCastException when retrieving a SqlGeography type from a DataReader? 【发布时间】:2014-09-13 21:40:07 【问题描述】:我正在使用 Visual Studio 2013 和 SQL Server 2012 在 C# 中进行开发。我已经能够使用 T-SQL 将多边形存储在地理列中,并且我没有尝试在代码中使用 SqlGeography 类来检索数据。
当我尝试时:
SqlGeography polyB = (SqlGeography)dr["extent"]; // stored in OGC Well Known Binary format
从我收到消息的数据库中检索多边形:
发生了“System.InvalidCastException”类型的未处理异常 在 GeoLib.dll 中
附加信息:[A]Microsoft.SqlServer.Types.SqlGeography 不能转换为 [B]Microsoft.SqlServer.Types.SqlGeography。 A型 源自 'Microsoft.SqlServer.Types, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' 在上下文中 位置的“默认” 'C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Types\10.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Types.dll'。
Type B 源自 'Microsoft.SqlServer.Types, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' 在上下文中 位置的“默认” 'C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Types\11.0.0.0__89845dcd8080cc91\Microsoft.SqlServer.Types.dll'。
我怀疑 SQL Server 和 Visual Studio 之间的版本不兼容,如不同的版本号所示。有没有人遇到过这个?也许我需要安装 SQL Server 2014?任何想法表示赞赏!
【问题讨论】:
您的项目中引用了哪个版本的 Microsoft.SqlServer.Types? 项目使用的是版本 11 - 我会尝试找到 10 并使用它。 戴夫——就是这样!我错过了“树木的森林”。谢谢! 为什么不将其发布为答案并为可能遇到类似问题的其他人回答您自己的问题。 完成 - 再次感谢 Dave。 【参考方案1】:原来我使用的是版本 11(我怀疑是 Visual Studio 2013 附带的),而不是 SQL Server 2012 必须使用的版本 10。当我将项目引用更改为版本 10 .dll 时,一切正常。
【讨论】:
【参考方案2】:虽然您自己的答案清楚地解决了您的问题(这很好),但通过做您所拥有的,您已经强迫自己无法访问某些仅在 SQL 2012 及更高版本中适用于 Geometry and Geography 的方法。
以下链接解释了解决此问题的一些更好的方法,请参阅Breaking Changes to Database Engine Features in SQL Server 2012
您会在页面下方的三分之一处找到相关信息,小标题为“SQL CLR 数据类型(几何、地理和层次 ID)”。我选择的方法是在 app.config 中重定向程序集 - 但如果您愿意/需要,可以使用其他方法之一。
请注意,SQL Server 2014 需要相同的解决方案,但与指定 Microsoft.SqlServer.Types 程序集的版本 12 尚不兼容,您也不能将“Sql Server 2014”指定为您的类型系统版本参数连接字符串 - 使用 2012。
截至撰写本文时正确。
抱歉回复晚了,希望对你有帮助。
【讨论】:
MSDN 文章中提供的连接字符串解决方法效果很好。包括“类型系统版本=SQL Server 2012;”在您的空间数据库连接字符串中。 配置文件有效,即使在 SQL Server 2016 中,在您的运行时,您的dependentAssembly 值更改为:<dependentAssembly> <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" /> <bindingRedirect oldVersion="10.0.0.0" newVersion="14.0.0.0 " /> </dependentAssembly>
使用您提供的链接中的BinaryReader
的解决方案对我来说非常有用!以上是关于从 DataReader 检索 SqlGeography 类型时如何解决 InvalidCastException?的主要内容,如果未能解决你的问题,请参考以下文章