gpt4 book ai didi

ado.net - SQL Server 2014 Native Client (12.0.0.0) - 有什么方法可以强制使用程序集版本(例如 SqlConnectionString "Type System Version")?

转载 作者:行者123 更新时间:2023-12-02 16:18:54 25 4
gpt4 key购买 nike

我正在编写一个应用程序(使用本地安装的.NET Framework 4.5.2 + SQL Server 2014)。该应用程序需要支持 SQL Server 2014 和以前的版本。

使用内置 SQLCLR 类型( SqlGeometrySqlGeographySqlHierarchyID )读取数据时,标准 ADO.NET 方法(例如 DataReader.GetValues() )使用 10.0.0.0程序集,并由于与加载的(v11 或 v12)版本不匹配而引发异常。

推理记录在 Breaking Changes in SQL Server 2012 中(尽管需要一段时间才能发现) (对于 11.0.0.0 程序集)。对于 SQL Server 2012,列出了三种解决方法:

  • 使用Type System Version=SQL Server 2012SQLConnection.ConnectionString

  • 或:使用app.config / runtime / assemblyBinding / dependentAssemblyv10.0.0.0 重新映射到 v11.0.0.0

  • OR(不是一个非常“简洁”的处理方式):重写您自己的代码以从 SqlBytes 手动反序列化实例...

在安装了 SQL Server 2014 的计算机上进行开发时,程序集版本为 v12.0.0.0,并且出现类似问题:

System.InvalidCastException: Unable to cast object of type Microsoft.SqlServer.Types.SqlGeometry to type Microsoft.SqlServer.Types.SqlGeometry.

对于 SQL Server 2014(除了可怕的手动反序列化方法),似乎只有一种解决方法(未在重大更改中正式记录) - 看起来 v4.5 SqlConnection还没有跟上SQL Server的版本:

  • 使用app.config / runtime / assemblyBinding / dependentAssemblyv10.0.0.0 重新映射到 v12.0.0.0

问题:除了将 app.config 中的 v10.0.0.0 重新映射到 v12.0.0.0 之外(这似乎有效),是否有其他(更简单的)方法可以使用引用的程序集版本?

下面的快速代码示例显示了失败(没有进行程序集重新映射):

private static void DoStuff()
{
SqlGeography geog_val = SqlGeography.STGeomFromText(new SqlChars("POLYGON((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))"), 4326);
SqlGeometry geom_val = SqlGeometry.Parse("LINESTRING(1 1,2 3,4 8, -6 3)");

prm_geog.Value = DBNull.Value; prm_geom.Value = geom_val; ReadReturnedSpatialColumns(cmd);
prm_geog.Value = geog_val; prm_geom.Value = DBNull.Value; ReadReturnedSpatialColumns(cmd);
}

private static void ReadReturnedSpatialColumns(SqlCommand cmd)
{
using (var dr = cmd.ExecuteReader(CommandBehavior.SingleRow))
{
dr.Read(); var items = new object[2]; dr.GetValues(items);
var geog_test = dr.IsDBNull(0) ? SqlGeography.Null : (SqlGeography)items[0];
var geom_test = dr.IsDBNull(1) ? SqlGeometry.Null : (SqlGeometry)items[1];
}
}

最佳答案

此问题在 Framework 4.6.1 中仍然存在,并且除了您已经发现的 3 个解决方案之外,似乎没有其他解决方案。因此,您的问题的简短答案是

但是,我会质疑您是否真的需要空间类型的版本 12,因为(据我所知)它们不会在 v11 类型上添加任何内容。如果您希望使用 v11 类型以便可以使用 Type System Version=SQL Server 2012 解决方法,则可以安装 Nuget package包含所有三个版本(10、11、12) - 它专门设计用于允许您部署到可能未安装 MSSQL 的服务器。

作为奖励,直接引用该包并使用 Type System Version=SQL Server 2012 将确保您的应用始终使用 2012 空间类型,因此升级到 SQL 2016 不会中断如果它决定默认返回不同版本(例如 13 或 14,或 2016 年将使用的任何版本),则可以执行任何操作。

关于ado.net - SQL Server 2014 Native Client (12.0.0.0) - 有什么方法可以强制使用程序集版本(例如 SqlConnectionString "Type System Version")?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29185673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com