Dot-Net

建立與 SQL Server 的連接時出錯

  • November 16, 2021

如果我在 web.config 中有這樣的連接字元串(添加換行符以提高可讀性):

<add 
name="conn" 
connectionString="Data Source=(localdb)\v11.0; Initial 
   Catalog=MyDB; Integrated Security=True; MultipleActiveResultSets=True; 
   AttachDbFilename=D:\Products.mdf" 
providerName="System.Data.SqlClient"/>

連接有效,我可以連接到數據庫資源管理器中的數據庫。

當我在程式碼中指定連接字元串或使用 ConfigurationManager 獲取它時,它不起作用:

   SqlCommand command = new SqlCommand();
   command.CommandText = "select ...";
   command.CommandType = CommandType.Text;
   SqlConnection cn = new SqlConnection("Data Source=(localdb)\\v11.0;"+
       "Initial Catalog=MyDB; Integrated Security=True; "+
       "MultipleActiveResultSets=True; AttachDbFilename=D:\\Products.mdf");
   command.Connection = cn;
   cn.Open();
   DataTable dataTable = new DataTable();
   SqlDataReader reader;
   reader = command.ExecuteReader();
   dataTable.Load(reader);
   cn.Close();

從 web.config 獲取連接字元串給出了相同的錯誤:

SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings
["conn"].ConnectionString;

我得到的錯誤是“ System.ComponentModel.Win32Exception:找不到網路路徑”

在跟踪是說:

建立與 SQL Server 的連接時發生與網路相關或特定於實例的錯誤。伺服器未找到或無法訪問。驗證實例名稱是否正確以及 SQL Server 是否配置為允許遠端連接。(提供者:命名管道提供者,錯誤:40 - 無法打開與 SQL Server 的連接)]

我需要一些幫助來解決這個問題,幾個小時以來一直在嘗試解決這個問題,任何線上建議都是我應該檢查網路設置(不適用,因為它連接到 sql server express 的本地實例)。伺服器名稱(相同的字元串在 VS Express 中有效,但在執行程式碼中無效)。

會不會是身份驗證問題?如果是這樣,那麼為什麼會出現資訊錯誤?

感謝您閱讀我的文章,希望您能幫助我解決這個問題。

更新:

我嘗試了以下事情:

賦予組每個人對 mdf 和 ldf 文件的完全權限

在 web 下的項目屬性中,我嘗試在 VS 開發伺服器和本地 IIS web 伺服器(是 IIS Express)下執行項目

不走運,將程式碼複製到使用“ASP.NET 空 Web 應用程序”創建的項目時,仍然無法完美連接

該問題與未在 .net 4.0 版中執行的應用程序有關

根據以下頁面: http: //www.connectionstrings.com/sql-server-2012#sqlconnection

您需要 .net 4.0 及更高版本才能使用命名管道:

4.0.2 之前的 .NET 框架版本不支持 Server=(localdb) 語法。但是,命名管道連接將用於將 4.0.2 之前的應用程序連接到 LocalDB 實例。

SqlLocalDB.exe create MyInstance
SqlLocalDB.exe start MyInstance
SqlLocalDB.exe info MyInstance

該資訊提供了命名管道,然後可以在連接字元串中使用它:

<add name="conn" 
providerName="System.Data.SqlClient" 
connectionString="Server=np:\\.\pipe\LOCALDB#B1704E69\tsql\query"/>

您已經正確地轉義了 db 文件名,但沒有轉義數據源,因此它嘗試連接到名為“(localdb)11.0”的數據源,該數據源(很可能)不存在。

嘗試像這樣正確地轉義它:

SqlConnection cn = new SqlConnection("Data Source=(localdb)\\v11.0;"+
"Initial Catalog=MyDB; Integrated Security=True; "+
"MultipleActiveResultSets=True; AttachDbFilename=D:\\Products.mdf");

引用自:https://stackoverflow.com/questions/15924877