【问题标题】:SqlGeography Type MismatchSqlGeography 类型不匹配
【发布时间】:2014-08-15 08:18:22
【问题描述】:

我在编写内部 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 进行比较。

初始异常如下:

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

如果有什么不清楚的,请开火,我会尽量详细说明。

谢谢!

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

【问题讨论】:

  • 我需要添加我引用的SqlServer.Types v11

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


【解决方案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

【讨论】:

  • 问题确实是 SQL Server 2012 使用版本 10 的空间类,而 .net 使用版本 11。
【解决方案2】:

我正在使用

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

要将 sql 表中的所有行加载到 DataTable 中,所以我不能使用 Dave R 提出的解决方案。我的解决方案是修改用于创建 SqlDataReader 的 sql 选择查询,以将 SqlGeography 列转换为字符串。示例:

原始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 ));

安本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    相关资源
    最近更新 更多