Theme NexT works best with JavaScript enabled

ShunNien's Blog

不積跬步,無以致千里;不積小流,無以成江海。

0%

解決 Microsoft.SqlServer.Types 參考使用的問題

解決 Microsoft.SqlServer.Types 參考使用的問題

透過 Entity Framework 使用 SQL Server 的空間資料 (DbGeography) 相當便利,但是需要 Microsoft.SqlServer.Types 參考,而有時參考後又出現問題。

Exception 訊息:

System.InvalidOperationException

HResult=0x80131509

Message=Spatial types and functions are not available for this provider because the > assembly ‘Microsoft.SqlServer.Types’ version 10 or higher could not be found.

Source=EntityFramework.SqlServer

Microsoft.SqlServer.Types 安裝

透過 Nuget 安裝 Microsoft.SqlServer.Types 套件,可以透過介面安裝或是透過指令安裝,安裝指令如下:

1
Install-Package Microsoft.SqlServer.Types

安裝好之後,請仔細閱讀 readme.htm ,其中說明如何將套件註冊進程式中

ASP.NET Web Sites

Web Form 中,開啟 Default.aspx.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
public partial class _Default : System.Web.UI.Page
{
static bool _isSqlTypesLoaded = false;

public _Default()
{
if (!_isSqlTypesLoaded)
{
SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~"));
_isSqlTypesLoaded = true;
}
}
}

ASP.NET Web Applications

開啟 Global.asax.cs 添加以下程式碼:

1
SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));

Desktop Applications

在執行空間操作前執行以下程式碼:

1
SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);

解決引用錯誤

就如同此文一開始所提到的 exception,按照Microsoft.SqlServer.Types套件的說明註冊引用,有時還是會出現問題,可能是 Entity Framework 版本因素或是伺服器沒有對應版本的Microsoft.SqlServer.Types或是沒有註冊引用到;stack overflow 此篇的討論方法可以解決我此次遇到的問題

  • 方法一

添加參照

1
SqlProviderServices.SqlServerTypesAssemblyName = Assembly.GetAssembly(typeof(Microsoft.SqlServer.Types.SqlGeography)).FullName;
  • 方法二

直接在 config 檔案中進行參照,需要注意版本號

1
2
3
4
5
6
<assemblyBinding>
<dependentAssembly>
<assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" />
<bindingRedirect oldVersion="10.0.0.0-11.0.0.0" newVersion="14.0.0.0" />
</dependentAssembly>
</assemblyBinding>

取得 PublicKeyToken

[Microsoft.SqlServer.Types] 的 DLL 的路徑,可以從以下路徑查找

1
C:\Windows\assembly\GAC_MSIL\Microsoft.SqlServer.Types

根據以上的 DLL 取得 PublicKeyToken 的方式,可以透過 powershell

1
([system.reflection.assembly]::loadfile("c:\MyDLL.dll")).FullName

參考資料

歡迎關注我的其它發布渠道