2010-03-19 223 views
177

我正在使用.mdf連接到databaseentityClient。現在我想更改連接字符串,以便不會有.mdf文件。MSSQL錯誤'底層提供程序在打開時失敗'

以下connectionString是否正確?

<connectionStrings> 
    <!--<add name="conString" connectionString="metadata=res://*/conString.csdl|res://*/conString.ssdl|res://*/conString.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.\SQL2008;AttachDbFilename=|DataDirectory|\NData.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />--> 
    <add name="conString" connectionString="metadata=res://*/conString.csdl|res://*/conString.ssdl|res://*/conString.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.\SQL2008;Initial Catalog=NData;Integrated Security=True;Connect Timeout=30;User Instance=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" /> 

因爲我總是得到錯誤:

The underlying provider failed on Open

+1

我在這裏有同樣的問題,當我嘗試IIS下運行。如果我在VS服務器上運行,則不會出現錯誤。 – Zote 2010-05-06 17:32:29

+9

我有同樣的問題,並從連接字符串中刪除了「集成安全性」,創建了一個用戶並確保他們具有「sysadmin」權限並將該用戶添加到連接字符串中。 – fuzz 2012-03-13 05:10:22

+0

您的數據庫位於何處,如果它位於託管在IIS 上的應用程序中,則應將數據庫置於App_Data文件夾中,並編輯由Entityframework模型生成的連接字符串以在此處查找。 http://stackoverflow.com/questions/9809442/entity-exception-the-underlying-provider-failed-to-open – 2012-03-22 11:57:10

回答

185

我有這個錯誤,並發現了幾個解決方案:

看你的連接字符串,它看起來有效。我發現this blog post,這裏的問題是他們使用的是Integrated Security。如果您在IIS上運行,則您的IIS用戶需要訪問數據庫。

如果您使用Entity Framework​​,Entity Framework會自動打開並關閉每個數據庫調用的連接。因此,在使用交易時,您試圖通過多個連接分攤交易。這升至MSDTC

See this reference for more information.

我的代碼更改爲以下固定它:

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

這是如何完成的使用Linq訪問表(使用EF4)? – 2010-07-30 15:15:43

+1

@Brett Rigby:http://stackoverflow.com/questions/794707/why-doesnt-transactionscope-work-with-entity-framework/794785#794785涵蓋如何做到這一點使用Linq/EF – 2011-04-26 15:48:05

+48

如果您使用的是EF/DBContext,那麼正確的調用是context.Database.Connection.Open(); – 2012-01-03 19:05:59

32

context.Connection.Open()沒有幫助解決我的問題,所以我想在DTC配置使「允許遠程客戶端」,沒有更多的錯誤。

在Windows 7中,您可以通過運行dcomcnfg,組件服務 - >計算機 - >我的電腦 - >分佈式事務處理協調器 - >右鍵單擊本地DTC - >安全來打開DTC配置。

+0

能否請您提供如何打開DTC配置 – Elangesh 2011-02-15 09:57:55

+11

在Windows 7中,您可以通過運行** dcomcnfg **,組件服務 - >計算機 - >我的電腦 - >分佈式事務處理協調器 - >右鍵單擊本地來打開DTC配置DTC - >安全。 – kerem 2011-03-03 16:48:57

+7

其實它是右鍵單擊本地DTC - >屬性 - >安全 – 2017-01-19 13:47:14

20

我發現這個問題是我必須在這些變體的一個連接字符串中的服務器路徑:

SERVER\SQLEXPRESS 
SERVER 

當我真的應該有:

.\SQLEXPRESS 

出於某種原因,我得到了每當它難以定位SQL實例時發生錯誤。

+6

這可能是因爲您沒有啓用命名管道作爲SQL Server的連接方法。 – Paul 2011-11-21 14:29:38

+1

@保羅,謝謝。這很可能是因爲它是一個全新的SQL安裝,其中禁用了命名管道。感謝您的提醒。 +1 – dooburt 2011-12-05 12:48:12

+1

感謝你們,因爲命名管道被禁用,我遇到了這個問題。 – 2014-04-01 08:01:05

1

我有一個類似的問題,由於連接狀態的異常,然後我意識到我有我的域服務類變量標記爲靜態(錯誤)。

我的猜測是,一旦服務庫被加載到內存中,每個新的調用都會使用相同的靜態變量值(域服務實例)結束,導致通過連接狀態發生衝突。

我認爲每個客戶端調用都會產生一個新的線程,所以多個線程訪問同一個域服務實例就等同於一個列車殘骸。

+0

這對我來說也是如此。看起來如果你將它標記爲靜態的,它只會導致它試圖使用的實例的各種問題。 – 2012-06-27 18:39:26

-1

你可以嘗試更換元數據:

metadata=res:///conString.csdl|res:///conString.ssdl|res://*/conString.msl

到:

metadata=res://*/;

+2

但是爲什麼?有什麼好處?爲什麼這個解決方案? – 2014-05-08 05:43:19

1

我被重置IIS,但仍然在連接字符串中使用Integrated Authentication擺脫這一點。

3

如果您還原數據庫並且用戶已經存在不同模式,也會發生這種情況,從而無法分配正確的權限。

要糾正此運行:

USE your_database 
EXEC sp_change_users_login 'Auto_Fix', 'user', NULL, 'cf' 
GO 
EXEC sp_change_users_login 'update_one', 'user', 'user' 
GO 
+0

絕對是這個問題。我剛剛從備份恢復。請看[http://www.fileformat.info/tip/microsoft/sql_orphan_user.htm]進行詳細分析。 – nesimtunc 2013-07-29 05:36:30

10

當您收到此異常,確保擴大細節,並期待在內部異常細節,因爲它會提供爲什麼登錄失敗的細節。在我的情況下,連接字符串包含一個沒有訪問我的數據庫的用戶。

無論您是使用集成安全性(已登錄的Windows用戶的上下文)還是單個SQL帳戶,請確保用戶在您嘗試訪問的數據庫的「安全」下有適當的訪問權限,以防止此問題。

+0

我遇到了與原始帖子相同的問題,驗證了我的主機名,並在內部異常中驗證了我正在使用正確的用戶名。 SSMS用戶安全性看起來是正確的 - SQL Server帳戶設置正確並且可以公開訪問數據庫。但是,登錄失敗。 – 2014-02-18 17:06:31

+0

「內部異常」狀態是什麼問題?這是我的答案,它將提供理解真正潛在問題所需的隱藏附加細節。 「內部異常」不會驗證您是否擁有正確的登錄名 - 這不是一個明確的例外。 – atconway 2014-02-18 17:25:55

+0

'登錄失敗,用戶'user'.' – 2014-02-18 17:59:22

3

SQL Server Express服務未設置爲自動啓動。

1)進入控制面板 2)管理工具 3)服務 4)設置的SQL Server Express通過點擊它 5)右鍵單擊自動啓動,並啓動服務

我希望意志幫幫我。

0

我有同樣的問題,但什麼工作對我來說是從連接字符串刪除此:

persist security info=True

1

定義SQL ServerWindows Firewall規則(和端口1433)在服務器上解決了這個錯誤(如果你的服務器名,用戶登錄名或密碼在連接字符串中沒有錯......) 。

-1

我剛剛刪除了Entity Framework 5並將其替換爲LINQ to SQL。它更容易...並且不再需要處理奇怪的異常。

實體框架5,多浪費時間。

有時候我們真的應該問自己,Entity Framework 5是否值得爲一些本應該很簡單的東西引入麻煩。

+0

多麼奇怪的解決問題的方法!清除問題! – 2015-05-05 17:28:45

0

我犯的一個常見錯誤是因爲我將應用程序從一臺電腦移到另一臺,而以上都沒有工作,因爲我忘記將連接字符串複製到App.Config和Web.Config!

0

我還面臨同樣的問題。現在我通過從連接字符串中刪除用戶名和密碼來完成它。

9

這只是常見問題。即使我遇到了這個問題。在開發計算機上,使用Windows身份驗證配置,它完美地工作:

<add name="ShoppingCartAdminEntities" connectionString="metadata=res://*/ShoppingCartAPIModel.csdl|res://*/ShoppingCartAPIModel.ssdl|res://*/ShoppingCartAPIModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.\SQlExpress;initial catalog=ShoppingCartAdmin;Integrated Security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 

一旦託管在IIS配置相同,我得到這個錯誤:

The underlying provider failed on Open

它解決了不斷變化的connectionString配置文件:

<add name="MyEntities" connectionString="metadata=res://*/ShoppingCartAPIModel.csdl|res://*/ShoppingCartAPIModel.ssdl|res://*/ShoppingCartAPIModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MACHINE_Name\SQlExpress;initial catalog=ShoppingCartAdmin;persist security info=True;user id=sa;password=notmyrealpassword;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 

其他常見的錯誤可能是:

  1. 數據庫服務可以停止
  2. 數據源屬性指向Windows身份認證的本地數據庫和託管在IIS
  3. 用戶名和密碼可能是錯的。
1

我有一個類似的錯誤與下面的內部異常:

operation is not valid for the state of the transaction

我可以通過啓用DTC安全設置解決。

DTC的

進入屬性,在安全選項卡,選中下面

  • 網絡DTC訪問的
  • 允許RemoteClients
  • 事務管理器通信
  • 允許入
  • 允許出站
1

如果碰巧碰到g在ASP.NET Web應用程序上出現此錯誤,除了提到的其他內容,請檢查以下內容:

  1. 數據庫用戶安全權限(允許哪些用戶訪問您的數據庫。
  2. 在IIS中檢查您的應用程序池,並確保它是允許訪問您的數據庫的正確的一個。
0

對我來說,這只是一個簡單的錯誤:

我用Amazon EC2,我的連接字符串中使用我的彈性IP地址,但是當我改變了IP地址,我忘了更新我的連接字符串。

2

確保提供的連接字符串中的每個元素值都是正確的。在我的情況下,我得到相同的錯誤,因爲連接字符串中指定的目錄名稱(數據庫名稱)不正確。

0

我有這種錯誤發生突然出了藍色在我們的網站之一。就我而言,事實證明,SQL用戶的密碼已過期!解除SQL Server Management Studio中的密碼過期框不成功!

0

我有一個類似的問題:在我的測試用例執行我總是得到這個錯誤。我發現,我的「分佈式事務服務」未啓動(運行:services.msc - >啓動「分佈式事務服務」(最好將其設置爲自動啓動))。我這樣做之後,它的工作就像一個魅力...

0

我複製的數據庫文件(.mdf/.ldf)複製到App_Data文件夾來擺脫這種異常。

19

您應該看到的InnerException看到 錯誤的投擲的內部原因是什麼。

在我的情況下,原來的錯誤是:

Unable to open the physical file "D:\Projects2\xCU\xCU\App_Data\xCUData_log.ldf". Operating system error 5: "5(Access is denied.)". An attempt to attach an auto-named database for file D:\Projects2\xCU\xCU\App_Data\xCUData.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.

它解決了充分的權限,以當前用戶使用文件的屬性訪問相關mdfldf文件。

0

IIS設置應用程序池標識作爲服務帳戶的用戶或管理員帳戶或有權做對數據庫的操作螞蟻帳戶。

-2

@ majidgeek的回答包含了最有用的信息:檢查InnerException屬性。在我的情況下,InnerException有一個自己的InnerException,它指出了我的問題:Windows防火牆阻止了MSDTC。一旦我啓用了分佈式事務協調器的傳入和傳出規則,一切都很好。

0

在我來說,我的連接字符串名稱我是在上下文的構造VS在我的web.config中的名字註冊之間的不匹配。簡單的錯誤引起的複製和粘貼:d

public DataContext() 
     : base(nameOrConnectionString: "ConnStringName") 
    { 
     Database.SetInitializer<DataContext>(null); 
    } 

0

我有同樣的錯誤,我發現這就是當我在我的connectionString 更改爲新的數據源 我忘了更改用戶名和passowrd新數據庫

0

如果未指定SQL Server實例名稱並且SQL主機安裝了多個SQL實例,那麼我也發生了此錯誤。這裏有幾個例子可以說明:

下面的連接字符串會導致異常「底層提供程序在打開時失敗」,而在a中沒有內部異常。NET的WebForms應用:

connectionString="metadata=res://*/Entities.csdl|res://*/Entities.ssdl|res://*/Entities.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost;Initial Catalog=Entities;User ID=user;Password=password;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" 

下面的連接字符串按預期執行的.NET的WebForms應用程序在SQL環境中有多個實例。難得我知道,但是我已經在我的dev的盒子幾個不同的SQL實例,以適應不同的項目:

connectionString="metadata=res://*/Entities.csdl|res://*/Entities.ssdl|res://*/Entities.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=localhost\SQLSERVER2014;Initial Catalog=Entities;User ID=user;Password=password;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" 
0
在我的情況下服務器地址

已經由服務器管理員改變了,所以我不得不改變連接字符串到新的服務器地址

0

我有這個問題,因爲應用程序池登錄這個應用程序運行下已經改變。

在IIS:

  • 查找點擊你的網站,要基本設置應用程序池。

  • 轉至應用程序池。

  • 點擊您的網站的應用程序池。

  • 單擊高級設置。

  • 在標識中,輸入帳戶登錄名和密碼。

  • 重新啓動您的網站,然後重試。

0

沒有答案的工作對我來說

我認爲,我們有些人都做出愚蠢的錯誤,也有100點的方式失敗......

我的問題是新項目,我在另一個項目中設置了所有的配置,但調用者是一個Web API項目,我必須在Web api項目中複製相同的連接字符串。

我認爲這是瘋狂的考慮我甚至沒有新的dbcontext或任何web api。

否則類庫試圖尋找一個名爲

TokenApi.Core.CalContext 
其中

數據庫我的項目被命名爲TokenApi.CoreCalContext是連接字符串的名字,我只

0

文件名包括密碼到我的web.config的連接字符串,爲我工作。

<add name="Test2016Entities" connectionString="metadata=res://*/Models.PersonDataContext.csdl|res://*/Models.PersonDataContext.ssdl|res://*/Models.PersonDataContext.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=KEDAR-PC;initial catalog=Test2016;user id=sa;password=mypc123;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
0

我已經解決了這個問題。

Step 1: Open Internet Information Service Manager

步驟2:點擊 在左側導航樹應用程序池。

第3步: 選擇您的版本池。在我的情況下,我使用ASP .Net v4.0。如果你沒有這個版本,請選擇DefaultAppPool。

第4步: 右鍵單擊第3步,然後選擇高級設置。

步驟5: 在屬性窗口中選擇標識,然後單擊按鈕以更改值。

第6步: 在內置帳戶組合框中選擇本地系統,然後單擊確定。 就是這樣。現在運行你的程序。一切運作良好。

Codeproject Solution : the-underlying-provider-failed-on-open

0

您好,如果您使用上下文類 您可以使用下面的代碼:

using (ClassContext context = new ClassContext()){ 
     ((IObjectContextAdapter)context).ObjectContext.Connection.Open(); 

     //SOMETHING TO DO...... 

     ((IObjectContextAdapter)context).ObjectContext.Connection.Close(); 
} 
相關問題