处理 SQL Server 2012 表中的空间数据类型

Posted

技术标签:

【中文标题】处理 SQL Server 2012 表中的空间数据类型【英文标题】:Dealing with spatial datatypes in SQL Server 2012 tables 【发布时间】:2012-10-20 12:25:36 【问题描述】:

一些背景:

我在两个不同的 VM 上运行两个不同的 SQL Server 安装。我正在尝试从我的代码(为 SQL Server 2008 R2 编写)连接到它们。我当前的 .NET 框架版本是 4.0。我的 Microsoft SQL Server 2008 R2 安装正在运行为其设计的 AdventureWorks,而我的 SQL Server 2012 Express 安装正在运行更新的 AdventureWorks2012 数据库。我正在查询 Person.Address。

目前我遇到了一个异常,说“DataType 不能为空”。我通过查看返回的架构推断出问题来自 SQL Server 2012 返回一个

Microsoft.SqlServer.Types.SqlGeography

数据类型。似乎 Type.GetType 无法将其转换为可用的东西并引发异常。我松了一口气,我什么都没做,但我也很困惑,因为这段代码应该可以通用。请记住,此代码在 SQL Server 2008 R2 上完美运行(因为它缺少空间数据类型)。

我可以想出 100 种不好的方法来处理这个问题。但是,我想向你们寻求建议。将 .NET 升级到 4.5 会解决这个问题吗?我是否必须更改我的代码以适应新的数据类型?如果我的应用程序不处理空间数据类型,我应该担心它们吗?我该如何处理,因为显然 SqlClient 和 Type.GetType 做得不好。

谢谢!

【问题讨论】:

假设您使用的是 LINQ to SQL,这可能与 Is it possible to use SqlGeography with Linq to Sql? 重复 @Pondlife - 错误消息不匹配。此外,建议的副本正在处理一个非常具体的案例,将地理转换为 varbinary。我认为这里不会发生这种情况。 这就是为什么它是“可能的”重复:) 但另一方面,基本问题似乎是您的 .NET 4.0 代码不支持 SqlGeography,这也是另一个中描述的基本问题问题 【参考方案1】:

如果您使用的是 2012 和 2008 R2,我建议您强制使用 SQL 2012 SqlGeography 类型。

您可能会考虑添加程序集重定向,因此任何尝试加载 2008 R2 SqlGeograph 的 .NET 代码都将被视为 SQL 2012 SqlGeography。 SQL 库在被序列化时通常是向后兼容的(只要可能,即当不使用 SQL 2012 特定功能时,例如 CurvePolygon)。

<runtime>
  <assemblyBinding>
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="11.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

【讨论】:

以上是关于处理 SQL Server 2012 表中的空间数据类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在SQL Server 2012中动态替换表中的所有值?

SQL Server 中的 tinyint 到 C# 中的字节

如何从MS SQL Server 2012中的不同表中减去连续的行?

当 SQL Server 表中的列“createdDate”从现在起经过 90 天后,如何更新其具有数百万行的列?我们可以使用触发器吗?

VBS确定SQL表中的记录数

SQL Server 数据库中的枚举