编写内部API时遇到以下错误。我正在尝试以以下方式读取SqlGeography
值(SQL Server 2012):
field: public SqlGeography XY { get; set; }
object dbValue = reader["xy"];
PropertyInfo info = type.GetProperty(columnName:"xy");
info.SetValue(entity, dbValue);
现在,尽管这看起来很奇怪,但我以这种方式阅读的原因是因为它是我编写的包装程序的一部分,我们使用它来加快sql的读写速度。它接受一个匿名对象,并根据属性名称或属性名称将所有sql值读入其中。
这对
SqlGeography
以外的所有内容都适用。我进行了类型比较,它也同样失败,因此很hacky,我什至无法检查该列是否为SqlGeography
类型,因为它总是无法与Microsoft.SqlServer.Types.SqlGeography
进行比较。最初的异常如下:
类型'Microsoft.SqlServer.Types.SqlGeography'的对象不能转换为t
是'Microsoft.SqlServer.Types.SqlGeography'。
如果有任何不清楚的地方,请开除,我将尽力详细说明。
谢谢!
接受的解决方案:
安装包Microsoft.SqlServer.Types-版本10.50.1600.1
最佳答案
您可能在Types程序集上存在版本不匹配的情况。这是版本10和11之间的一个已知问题。不幸的是,该错误消息不包含版本信息,这就是为什么它看起来很废话!
为了解决这个问题,您可以反序列化类型的二进制表示形式,即类似这样的内容(如果您的地理位置列在结果集中的第一列):
var geo = SqlGeography.Deserialize(reader.GetSqlBytes(0));
还有其他解决方法,包括对程序集进行绑定重定向。
此处更多信息:https://connect.microsoft.com/SQLServer/feedback/details/685654/invalidcastexception-retrieving-sqlgeography-column-in-ado-net-data-reader
关于c# - SqlGeography类型不匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25323301/