gpt4 book ai didi

c# - 从数据库中提取数据时无法转换 SqlGeography

转载 作者:行者123 更新时间:2023-12-05 01:40:08 25 4
gpt4 key购买 nike

我无法从 MS SQL DB 获取 SqlGeography 对象,我使用 .net 核心应用程序和 linq2db 作为提供者,但我有一个异常(exception):“无法为几何创建‘GIS_CH_DB.sys.geography’类型或‘’特定类型。”

但是我在用

var provider = (SqlServerDataProvider)DataConnection.GetRegisteredProviders()[LinqToDB.ProviderName.SqlServer2014];
provider.AddUdtType<SqlGeography>("Geography", null, LinqToDB.DataType.Udt);
provider.AddUdtType<SqlGeometry>("Geometry", null, LinqToDB.DataType.Udt);

应该将 SQLGeography 转换为正确的对象。有人知道如何解决这个问题吗?

最佳答案

编辑:添加 retown 而不是 return null

正如评论中所提到的,这是由于空间类型程序集 (Microsoft.SqlServer.Types) 之间的版本冲突所致,由 sql 客户端和您拥有的实际程序集请求。虽然对于 .net 框架应用程序,您可以使用绑定(bind)重定向来处理它,但对于 .net 核心,您不能这样做,因为:

  • .net 核心中没有绑定(bind)重定向
  • 即使会有 - 由于公钥不同,它们也不会工作

您需要注册自定义程序集解析器来修复它(基于 https://github.com/dotnet/core/issues/290#issuecomment-280451104 ):

// somewhere in your init code
AssemblyLoadContext.Default.Resolving += OnAssemblyResolve;

Assembly OnAssemblyResolve(AssemblyLoadContext assemblyLoadContext, AssemblyName assemblyName)
{
try
{
AssemblyLoadContext.Default.Resolving -= OnAssemblyResolve;
return assemblyLoadContext.LoadFromAssemblyName(assemblyName);
}
catch
{
if (assemblyName.Name == "Microsoft.SqlServer.Types")
return typeof(SqlGeography).Assembly;
throw;
}
finally
{
AssemblyLoadContext.Default.Resolving += OnAssemblyResolve;
}
}

我将更新 linq2db 文档以提及它,并检查我们是否可以改善这种情况

关于c# - 从数据库中提取数据时无法转换 SqlGeography,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57012534/

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