SqlGeography类型不匹配

时间:2014-08-15 08:18:23

标签: c# sql .net sql-server-2012

编写内部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);

现在虽然这可能看起来很奇怪,但我以这种方式阅读的原因是因为它是我编写的Wrapper的一部分,我们用它来加速sql的读写。它需要一个匿名对象,并根据属性名称或属性名称将所有sql值读入其中。

这适用于除SqlGeography之外的所有内容。我进行了类型比较,但它也失败了,因为它甚至不能检查列是否为SqlGeography类型,因为它总是无法与Microsoft.SqlServer.Types.SqlGeography进行比较。 / p>

最初的例外情况如下:

  

“Microsoft.SqlServer.Types.SqlGeography”类型的对象无法转换为t   ype'Microsoft.SqlServer.Types.SqlGeography'。

如果有任何不清楚的地方,请开火,我会尽力详细说明。

谢谢!

  • 接受的解决方案: 安装包Microsoft.SqlServer.Types -Version 10.50.1600.1

2 个答案:

答案 0 :(得分:5)

您可能在“类型”程序集上存在版本不匹配。这是版本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

答案 1 :(得分:1)

我正在使用

DataTable dt;
//...
dt.Load(reader)

将sql表中的所有行加载到DataTable中,因此我无法使用Dave R.提出的解决方案。我的解决方案是修改用于创建SqlDataReader以将SqlGeography列转换为字符串的sql select查询。例如:

原始sql查询:

SELECT [SpatialColumn] as SpatialData FROM [SpatialTable]

修改过的sql查询:

SELECT [SpatialColumn].STAsText() as SpatialData FROM [SpatialTable]

然后你必须改变你的c#代码来将字符串解析为真正的SqlGeography,如下所示:

using Microsoft.SqlServer.Types.SqlGeography;

string spatialData = (string) dt.Rows[0]["SpatialData"];
SqlGeography geoGraphy = SqlGeography.Parse(new System.Data.SqlTypes.SqlString(spatialData ));

鞍本。