我想在C#.NET项目中使用SQLServer的空间CLR类型。 我想用SqlGeometry查询空间记录了我的分贝。
我有我在单元测试运行在本地机器上这个工作在Visual Studio 2010中创下了远程机器的SqlServer。 都好。
然后,我发布一个WCF REST服务,以我的本地IIS实例有碰到相同的类库的单元测试做一些空间查询服务,它失败。
我得到一个错误说
无法加载DLL SqlServerSpatial.dll:指定的模块找不到。
我用Google搜索,发现这个很多很多的答案 - 我没有工作。 我有:
- 与GAC注册的CLR类型
- 安装64位,后来还中,VC的32位版本++
- 尝试使用不同的Microsoft.SqlServer.Types DLL版本的许多变化
我没有做过,并坦率地拒绝这样做的唯一的事情,就是安装在实际的SqlServer框中输入任何内容。 这似乎不需要我。
在这一点上,我能想到是造成这一点的唯一事情是一个权限问题,因为它是在IIS应用程序池,而不是内部的工作室,它工作在单元测试运行。
请注意,在我的项目,我从来没有提及的错误消息中提到的DLL。 该DLL是出现在SQL框,但它提供了一些信息,当我尝试,我不能把它添加到工作室。 我跑出来的东西,试图在这里。 这是90年代的DLL地狱一遍。
我有一个在Windows Server 2012机器上同样的问题。 它在\ Windows \ System32下的SqlServerSpatial110.dll文件,但没有SqlServerSpatial.dll。 该解决方案是为SQL Server 2008 R2的计算机上安装Microsoft系统CLR类型。
- http://www.microsoft.com/en-us/download/details.aspx?id=26728
- 点击下载
请关闭这些取决于你的处理器架构之一 :
- 1033 \ 64 \ SQLSysClrTypes.msi
- 1033 \ 86 \ SQLSysClrTypes.msi
- 1033 \ IA64 \ SQLSysClrTypes.msi
点击下一步
我的问题是类似你们:我安装我的ASP.NET MVC项目上的远程Azure的虚拟机,我得到这个异常:
"Unable to load DLL 'SqlServerSpatial110.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)"
为了解决我按照这些步骤的问题:
我加了参考丢失的包裹在我的项目:
PM> Install-Package Microsoft.SqlServer.Types
然后,我被迫“始终复制”的“复制到输出目录”选项SqlServerSpatial110.dll
( 可能这一步并不严格要求......)
对于ASP.NET项目,你需要下面的代码行添加到Application_Start
在方法Global.asax.cs
:
SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
这最后一步对我来说根本 ,因为whitout这行代码的DLL不是由Web应用程序加载。
我一直在使用Microsoft.SqlServer.Types.dll
在WPF和ASP.NET应用程式上工作SqlGeometry
类型和空间查询多年(从第10节),这里是我发现成功加载最新提示SqlServerSpatialXXX.dll
为的的先决条件之一Microsoft.SqlServer.Types.dll
。
-
SqlGeometry
和SqlGeography
类型可以在VS项目(例如C#)通过参考使用Microsoft.SqlServer.Types.dll
。 -
Microsoft.SqlServer.Types.dll
是一个托管库,并有一些非托管库作为先决条件,他们都喜欢SqlServerSpatialXXX.dll和msvcrXXX.dll - 由于SQL Server 2008中,不同版本的
Microsoft.SqlServer.Types.dll
都可以,不过,我没有看到2012年的任何功能的变化。
考虑64位/ 32位的问题
- 对于64个machanies,如果你安装了CLR类型对于SQL Server,你可以找到在Windows / System32下这些先决条件文件的64位版本,你也可以找到在Windows / Syswow64资料夹的先决条件文件的32位版本
- 如果CLR类型是不是一台机器上安装,您应该手动加载基于你的项目(32位或64位),这些先决条件的正确版本(32位/ 64位),否则你会这样的错误
错误加载SqlServerSpatialXXX.dll
您可以在运行时使用C#中检查32位/ 64位的问题Environment.Is64BitProcess
。 下面是一个示例代码:
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr LoadLibrary(string libname);
private static void LoadNativeAssembly(string nativeBinaryPath, string assemblyName)
{
var path = Path.Combine(nativeBinaryPath, assemblyName);
if (!File.Exists(path))
{
throw new FileNotFoundException($"{path} not found");
}
var ptr = LoadLibrary(path);
if (ptr == IntPtr.Zero)
{
throw new Exception(string.Format(
"Error loading {0} (ErrorCode: {1})",
assemblyName,
Marshal.GetLastWin32Error()));
}
}
public static void LoadNativeAssembliesv13(string rootApplicationPath)
{
var nativeBinaryPath = Environment.Is64BitProcess
? Path.Combine(rootApplicationPath, @"SqlServerTypes\x64\")
: Path.Combine(rootApplicationPath, @"SqlServerTypes\x86\");
LoadNativeAssembly(nativeBinaryPath, "msvcr120.dll");
LoadNativeAssembly(nativeBinaryPath, "SqlServerSpatial130.dll");
}
考虑不同项目类型的二进制路径建议有一个名为SqlServerTypes的文件夹中的项目像这样的执行路径
SqlServerTypes> 64
SqlServerTypes> X32
和负载的非托管组件这样
Utilities.LoadNativeAssembliesv13(Environment.CurrentDirectory); //WPF
Utilities.LoadNativeAssembliesv13(HttpRuntime.BinDirectory); //ASP.NET
使用ADO.NET时问题,尽管它的版本从SQL Server读取SqlGeometry Microsoft.SqlServer.Types.dll
您使用,如果您尝试使用ADO.NET从SQL Server读取它们可能会遇到强制转换异常,因为SQL客户端通过10.0.0.0默认加载版本Microsoft.SqlServer.Types.dll
。 在这种情况下,一些年前,我试过WKB(方法1和2),并作为高铁总站之间转换的媒介SqlGeometry
类型不同版本的Microsoft.SqlServer.Types.dll
,发现WKB快10倍左右,但一些一个月前,我发现使用程序集重定向,我们可以强制程序加载,我们正在使用的版本,并使用一个简单的铸件,我们可以得到SqlGeometry
(方法3)
private List<SqlGeometry> SelectGeometries(string connectionString)
{
SqlConnection connection = new SqlConnection(connectionString);
var command = new SqlCommand(select shapeCol from MyTable, connection);
connection.Open();
List<SqlGeometry> geometries = new List<SqlGeometry>();
SqlDataReader reader = command.ExecuteReader();
if (!reader.HasRows)
{
return new List<SqlGeometry>();
}
while (reader.Read())
{
//approach 1: using WKB. 4100-4200 ms for hundred thousands of records
//geometries.Add(SqlGeometry.STGeomFromWKB(new System.Data.SqlTypes.SqlBytes((byte[])reader[0]), srid).MakeValid());
//approach 2: using WKB. 3220 ms for hundred thousands of records
//geometries.Add(SqlGeometry.Deserialize(reader.GetSqlBytes(0)));
//approach 3: exception occur if you forget proper assembly redirection. 2565 ms for hundred thousands of records
geometries.Add((SqlGeometry)reader[0]);
}
connection.Close();
return geometries;
}
我有一个在Windows Server 2008 R2机器(VM天青)上的问题,但没有上述步骤能够解决这个问题。 我安装了CLR类型。 我把文件在我的Web应用程序的bin文件夹。 依然没有。 我终于在微软碰到这个博客走过来的人们和它的工作。 我在这里留下网址的情况下,它可以帮助其他人。
http://blogs.msdn.com/b/adonet/archive/2013/12/09/microsoft-sqlserver-types-nuget-package-spatial-on-azure.aspx
由于上面的链接不再工作(!感谢MSFT),我已经把下面的说明:
- 打开Visual Studio并打开NuGet包管理器
- 搜索“Microsoft.SqlServer.Types”
- 安装...
该软件包将安装必要的.DLL文件到您的解决方案/项目。 它也将直接复制一些额外的库到你的/ bin目录。 必须连接起来,以这些附加库的引用您的Global.asax.cs / VB文件。 有关于如何做到这一点列入NuGet包的说明。 下面是一个直接链接到NuGet包(希望MSFT不动被人遗忘这太)。
https://www.nuget.org/packages/Microsoft.SqlServer.Types/
尽管有安装了SQL Server 14.x,VS一直坚持SqlServerSpatial 110 .dll文件未找到。
为SQL Server 2008 R2并没有解决它安装Microsoft系统CLR类型 。 我也尝试安装10.5版本的Microsoft.SqlServer.Types
,但收到的PInvoke错误有关该方法的签名不匹配。
所以不是我装Microsoft.SqlServer.Types
14.x,然后改名为SqlServerSpatial 140 .dll文件到SqlServerSpatial 110 .dll文件均/ x86和/ X64文件夹,并没有在同一Loader.cs
。 无论出于何种原因,似乎这样的伎俩。
我在godaddy的VPS与Windows Server 2012 R2相同的问题
I Resolved it by Updating my EF5 to EF6
在包管理器控制台运行至EF5来到EF lalest
Install-Package EntityFramework
从引用删除Microsoft.SqlServer.Types.dll和使用的NuGet来安设。 检查您的版本之前安装。 对x86和x64的组件将被安装在该项目。
我一直就在ASP.NET MVC 5项目类似的问题。 前阵子我不得不添加一行来指定,像这样的大会名称:
SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
SqlProviderServices.SqlServerTypesAssemblyName = Assembly.GetAssembly(typeof(Microsoft.SqlServer.Types.SqlGeography)).FullName;
我最近部署到一个新的测试服务器,并再次得到这个错误。 它试图加载12版出于某种原因。 我现在具体的版本我想和它的作品如预期。
SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
SqlProviderServices.SqlServerTypesAssemblyName = "Microsoft.SqlServer.Types, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";
希望这可以帮助别人。