[.NET]解決sqlserver "基礎提供者open失敗(The underlying provider failed on Open)" 的問題

  • 9005
  • 0
  • 2019-10-08

[.NET]解決sqlserver "基礎提供者open失敗(The underlying provider failed on Open)" 的問題

@在九成的情況下,都是.config檔案的連線字串格式寫錯了,重新修正即可連線db。

@但是在正式環境Production的情況下,如果利用發行檔發行web程式在IIS上面跑+使用windows驗證帳號登入db+使用EF(Entity Framework)存取db+用transactionscope同時修改多個資料表的話,EF就會對資料庫同時開啟多個連線,就會牽扯到MSDTC安全性,同樣也會出現 基礎提供者open失敗 的問題。

建議解決方法:(請每一個方法都試試看,因為每個人的上線環境都不同,不能保證單一解法就一定有用)
1. 可以去請教一下對方的MIS的防火牆是否能關閉MSDTC這個安全性

2. 試著在使用EF存取DB之前,加上connection.open,例子如下:

using (DatabaseEntities context = new DatabaseEntities())
{
    context.Connection.Open();
    // the rest
}

3. 開啟Microsoft Distributed Transaction Coordinator的設定,讓電腦可允許分散式的多個連線同時存取
i.執行dcomcnfg指令
ii.選擇元件服務=>選擇電腦=>選擇我的電腦
iii.選擇 Distributed Transaction Coordinator
iv.右鍵選擇 本機DTC=>選擇 內容
v.選擇安全性頁籤
vi.打勾網路DTC存取, 打勾允許遠端用戶端, 打勾允許遠端系統管理, 打勾允許輸入, 打勾允許輸出, 選取不需要驗證,打勾啟用XA交易
vii.按下OK
viii.透過控制台打開windows防火牆設定=>點選允許應用程式通過防火牆
ix.打勾分散式交易協調器=>打勾分散式交易協調器右方的的網域、私人、公用選項
x.重新啟動SQLServer(透過ssms重啟或是到服務裡面的sqlserver選項重啟都可以)
xi.重新啟動iis

4.改用sqlserver驗證的帳號密碼的方式登入db
5. 改用begin transaction的方式進行交易,而不要使用transactionscope



參考資料:
How to configure the Distributed Transaction Coordinator service to run eConnect for Microsoft Dynamics GP 9.0 on a Windows Vista-based computer
https://support.microsoft.com/zh-tw/help/933931/how-to-configure-the-distributed-transaction-coordinator-service-to-ru
How to set up Microsoft Distributed Transaction Coordinator in Windows 7 for SendSuite Tracking 
https://support.pitneybowes.com/SearchArticles/VFP05_KnowledgeWithSidebarHowTo?id=kA180000000CrEgCAK&popup=false;&lang=en_US
EntityFramework 基礎提供程序在 Open 上失敗
https://www.itread01.com/content/1499834294.html
MSSQL Error 'The underlying provider failed on Open'
https://stackoverflow.com/questions/2475008/mssql-error-the-underlying-provider-failed-on-open