1

一些背景:

我在两个不同的 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 做得不好。

谢谢!

4

1 回答 1

0

如果您使用的是 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>
于 2013-02-21T16:06:59.183 回答