こんにちは。beaglesoftの真鍋です。
SQL ServerからGeography型のデータを取得するときに、「SqlServerSpatial110.dll
が見つかりません」というエラーが出ることがあります。最初は何のことかさっぱりわからなかったのですが、いろいろと調べたところDbGeoGraphy型が内部でSqlServerSpatial110.dll
を利用しているため、あらかじめプログラムの実行時にはロードしておく必要が有るけれども、そのロードを行っていないと発生するエラーのようです。
対応方法としては次の通り対応することで利用可能になりました。
- NuGet Packageをインストールする。
- アプリケーションごとにロード方法を設定する。
- App.configまたはweb.configにバージョンを追加する。
NuGet Packageをインストールする
NuGet Packageのインストールは以下のとおり実行可能です。
Install-Package Microsoft.SqlServer.Types
NuGet Gallery | Microsoft.SqlServer.Types (Spatial) 11.0.2
アプリケーションごとにロード方法を設定する
NuGetのインストール時に表示されるReadmeに記述が表示されますが、以下の設定を行う必要があります。
ASP.NETアプリケーション
Global.asax
のApplication_Start
メソッドで以下の設定を記述する必要があります。
SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
Windowsアプリケーション
Windowsアプリケーションではアプリケーションの起動時に以下の設定を記述する必要があります。(厳密には、SqlServerSpatial110.dll
が実行される前までに読み込まれていれば良いと記述があります。)
SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
ユニットテスト
ユニットでストでは、ユニットテストクラスにも上記のNuGet Packageをインストールする必要があります。また、SqlServerSpatial110.dll
を利用した処理を実行するテストクラスでは以下のとおり予め読み込み処理を実行する必要があります。
[ClassInitialize] public static void ClassInitialize(TestContext context) { SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory); }
App.configまたはweb.configにバージョンを追加する
App.configまたはweb.configに以下の通りバージョンを指定します。
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" /> <bindingRedirect oldVersion="10.0.0.0" newVersion="11.0.0.0" /> </dependentAssembly> ...
参考にしたサイト
.net - SqlServerSpatial110.dll failed to copy on Windows Azure deployment - Stack Overflow .net - SqlServerSpatial110.dll failed to copy on Windows Azure deployment - Stack Overflow Microsoft.SqlServer.Types NuGet Package (Spatial on Azure) - ADO.NET Blog - Site Home - MSDN Blogs