33

C# .Net プロジェクトで SqlServer Spatial CLR 型を使用しようとしています。SqlGeometry を使用して、データベースから空間レコードをクエリしたいと考えています。

リモート SqlServer マシンにヒットする Visual Studio 2010 で実行されている単体テストで、ローカル マシンでこれを実行しています。すべて良い。

次に、WCF Rest サービスをローカルの IIS インスタンスに発行します。このインスタンスは、ユニット テストと同じクラス ライブラリにアクセスして空間クエリを実行し、失敗します。

というエラーが表示されます

DLL SqlServerSpatial.dll を読み込めません: 指定されたモジュールが見つかりませんでした。

私はこれをグーグルで検索し、非常に多くの答えを見つけました-どれも私にとってはうまくいきません. 私は持っている:

  • GACにCLRタイプを登録しました
  • VC++ の 64 ビット版をインストールし、それ以降は 32 ビット版もインストールします。
  • さまざまな Microsoft.SqlServer.Types dll バージョンを使用して多くのバリエーションを試しました

私が行っていない唯一のことは、実際の SqlServer ボックスに何かをインストールすることです。これは私には不必要に思えます。

この時点で、これを引き起こしていると考えられる唯一のことは、IIS アプリ プールで実行されており、単体テストで動作する Studio 内では実行されていないためです。

私のプロジェクトでは、エラー メッセージに記載されている dll を決して参照しないことに注意してください。そのdllはSQLボックスに存在しますが、追加しようとするとメッセージが表示されるため、スタジオに追加できません。ここで試すものがなくなってきました。90 年代の dll 地獄が再び発生しました。

4

10 に答える 10

36

WindowsServer2012マシンでも同じ問題が発生しました。\ Windows \ System32にSqlServerSpatial110.dllファイルがありましたが、SqlServerSpatial.dllはありませんでした。解決策は、SQL Server2008R2用のMicrosoftシステムCLRタイプをマシンにインストールすることでした。

  1. http://www.microsoft.com/en-us/download/details.aspx?id=26728
  2. [ダウンロード]をクリックします
  3. プロセッサアーキテクチャに応じて、次のいずれかをチェックしてください。

    • 1033 \ x64 \ SQLSysClrTypes.msi
    • 1033 \ x86 \ SQLSysClrTypes.msi
    • 1033 \ IA64 \ SQLSysClrTypes.msi
  4. [次へ]をクリックします

于 2013-02-10T11:01:40.940 に答える
8

私はMicrosoft.SqlServer.Types.dllWPF および ASP.NET アプリでSqlGeometryタイプおよび空間クエリを何年も (v.10 以降)使用してきましSqlServerSpatialXXX.dllMicrosoft.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 ビット マシンの場合、Sql Server の CLR タイプをインストールすると、これらの前提条件ファイルの 64 ビット バージョンがWindows/System32にあり、32 ビット バージョンの前提条件ファイルがWindows/SysWOW64フォルダーにあります。
  • 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>x64

SqlServerTypes>x32

このようにアンマネージアセンブリをロードします

Utilities.LoadNativeAssembliesv13(Environment.CurrentDirectory); //WPF
Utilities.LoadNativeAssembliesv13(HttpRuntime.BinDirectory); //ASP.NET 

ADO.NET を使用して Sql Server から SqlGeometry を読み取る際の問題 使用して いるバージョンに関係なく、ADO.NET を使用して Sql Serverからそれらを読み取ろMicrosoft.SqlServer.Types.dllうとすると、キャスト例外が発生する可能性があります。これは、SQL クライアントがデフォルトでバージョン 10.0.0.0 をロードするためです。の。この場合、数年前に私は WKB (アプローチ 1 と 2) と WKTを異なるバージョンの型の間で変換するための媒体として試してみました。使用しているバージョンをロードし、単純なキャストを使用して取得できます(アプローチ 3)Microsoft.SqlServer.Types.dllSqlGeometryMicrosoft.SqlServer.Types.dllSqlGeometry

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;
}
于 2016-11-30T05:09:26.250 に答える
4

Windows Server 2008 R2 マシン (Azure VM) で問題が発生していましたが、上記のどの手順でも問題を解決できませんでした。CLRタイプをインストールしました。ファイルを Web アプリケーションの BIN フォルダーに配置します。まだ何もありません。私は最終的にマイクロソフトの人々によってこのブログに出くわし、それはうまくいきました. 他の誰かを助けることができる場合に備えて、ここに URL を残します。

http://blogs.msdn.com/b/adonet/archive/2013/12/09/microsoft-sqlserver-types-nuget-package-spatial-on-azure.aspx

私は以下の指示を入れました:

  1. Visual Studio を開き、NuGet パッケージ マネージャーを開きます
  2. 「Microsoft.SqlServer.Types」を検索します
  3. インストール...

このパッケージは、必要な .DLL をソリューション/プロジェクトにインストールします。また、いくつかの追加ライブラリを /bin ディレクトリに直接コピーします。これらの追加ライブラリへの参照を global.asax.cs/vb ファイルに接続する必要があります。これを行う方法については、NuGet パッケージに含まれている説明書があります。以下は、NuGet パッケージへの直接リンクです (MSFT がこれを無視しないことを願っています)。

https://www.nuget.org/packages/Microsoft.SqlServer.Types/

于 2014-08-28T17:57:35.083 に答える
2

Windowsサーバー2012 r2のgodaddy VPSで同じ問題が発生しました

I Resolved it by Updating my EF5 to EF6

パッケージマネージャーコンソールでEF5からEF最新まで実行

Install-Package EntityFramework 
于 2017-12-16T17:55:15.693 に答える
0

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";

これが誰かに役立つことを願っています。

于 2019-03-19T14:26:10.867 に答える