1. 程式人生 > >關於VS2013,sql連線與EF訪問遠端sql資料庫,記憶體訪問非法。

關於VS2013,sql連線與EF訪問遠端sql資料庫,記憶體訪問非法。



問題描述:

應用程式崩潰,或安裝 Visual Studio 2013年或.NET Framework 4.5.1 後,使用 System.Data.SqlClient,則會出現"AccessViolationException"異常

EF使用System.Data.SqlClient也會報記憶體訪問非法異常。

異常堆疊4種,僅列一種:

<Module>.SNIAddProvider(SNI_Conn*, ProviderNum, Void*)

SNINativeMethodWrapper.SNIAddProvider(System.Runtime.InteropServices.SafeHandle, ProviderEnum, UInt32 ByRef)

System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean, Boolean, Boolean ByRef)

System.Data.SqlClient.TdsParser.Connect(System.Data.SqlClient.ServerInfo, System.Data.SqlClient.SqlInternalConnectionTds, Boolean, Int64, Boolean, Boolean, Boolean)

System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(System.Data.SqlClient.ServerInfo, System.String, Boolean, System.Data.ProviderBase.TimeoutTimer, System.Data.SqlClient.SqlConnection)

System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(System.Data.SqlClient.ServerInfo, System.String, Boolean, System.Data.SqlClient.SqlConnection

解決方法:

netsh winsock reset catalog

微軟的解決方法:

若要變通解決此問題,請嘗試以下方法:

  • 解除安裝非 IFS Bsp 或 Lsp。若要執行此操作,請使用下列方法之一:
    • 解除安裝在系統上安裝了非 IFS BSP 或 LSP的應用程式。
    • 在命令提示符處執行以下命令:

      netsh winsock remove provider <id>

      注意在此命令中,"目錄條目 Id"值為非-IFS LSP 時執行下面的命令顯示的 <id> 表示:

      netsh winsock show catalog
  • 解除安裝.NET Framework 4.5.1。


    注意如果在系統上安裝了 Visual Studio 2013,此選項不適用。

原理:

由於一些非-IFS Winsock 基礎服務提供商 (Bsp) 或分層服務提供程式 (Lsp) 安裝在系統上擷取和更改的傳入和傳出網路通訊,則會出現此問題。因此,當應用程式連線到 SQL Server 時,這些 Bsp 或 Lsp 干擾 Winsock 通訊,造成記憶體訪問非法。