无法连接本地数据库SQL

问题描述 投票:0回答:3

我使用 SQL Server(本地数据库)创建的本地数据库有问题。 我可以连接到我的计算机上的数据库,但如果我尝试连接到另一台计算机,则会收到以下错误消息: enter image description here

我想要一个本地数据库来存储数据,我不需要服务器来管理数据库。

这是我的连接字符串:

`<connectionStrings>
    <add name="stocksDB" connectionString="Data Source= (LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\myDB.mdf;Integrated Security=True;" providerName="System.Data.SqlClient"/>
  </connectionStrings>`

我已将“SQL Server 2012 Express LocalDB”包含在先决条件中。

enter image description here

我做错了什么?

c# sql sql-server database-connection local
3个回答
1
投票

如果您有两台计算机(假设它们的计算机名称是“pc_a”和“pc_b”,它们联网,并且程序在计算机“pc_a”上运行,数据库驻留在计算机“pc_b”上,那么您的连接字符串需要包括计算机“pc_b”的机器名称。

即使是本地机器,您也可以提供机器名称,因此如果程序与数据库在同一台机器上运行,或者程序在一台机器上运行而数据库在另一台机器上,下面的代码将起作用,所以只要两台机器联网,并且您运行程序的帐户可以访问机器、实例和数据库。

请注意,在下面的示例中,安装 SQL 时使用了“默认”实例名称 (MSSQLSERVER)。当数据库实例名称是默认名称时,您不得显式提供实例名称(如果这样做,您将收到显示的错误)。您唯一一次显式提供实例名称是当它不是默认实例名称时。下面的代码可以处理任一场景(通过将 dbInstanceName 变量设置为“”或实例名称,例如“\SQLEXPRESS”)。参见 S.O.

SQL Server:如何查找所有 localdb 实例名称。如果有疑问,请尝试使用空实例名称和您认为是实例名称的名称,看看效果如何。

string databaseMachineName = "pc_b"; string databaseInstanceName = ""; string dbName = "stocksDb"; using (SqlConnection sqlConnection = new SqlConnection("Data Source=" + databaseMachineName + databaseInstanceName + "; Initial Catalog=" + dbName + "; Integrated Security=True;Connection Timeout=10")) { . . . }
    

0
投票
解决了!问题是另一台计算机上的 SQL Server 版本错误。我的主计算机上有 SQL Server 2014,另一台计算机上有 2012 版本,因此“数据库实例名称”不同。感谢@Nova Sys Eng 的意见!

现在我更改了连接字符串: 首先,我使用代码来检索计算机上安装的所有 SQL Server 实例,如 Nova Sys Eng 发布的链接中所述。

var instances = GetLocalDBInstances(); var connString= string.Format("Data Source= (LocalDB)\\{0};AttachDbFilename=|DataDirectory|\\myDB.mdf;Integrated Security=True;",instances[0]); internal static List<string> GetLocalDBInstances() { // Start the child process. Process p = new Process(); // Redirect the output stream of the child process. p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.FileName = "cmd.exe"; p.StartInfo.Arguments = "/C sqllocaldb info"; p.StartInfo.CreateNoWindow = true; p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; p.Start(); // Do not wait for the child process to exit before // reading to the end of its redirected stream. // p.WaitForExit(); // Read the output stream first and then wait. string sOutput = p.StandardOutput.ReadToEnd(); p.WaitForExit(); //If LocalDb is not installed then it will return that 'sqllocaldb' is not recognized as an internal or external command operable program or batch file. if (sOutput == null || sOutput.Trim().Length == 0 || sOutput.Contains("not recognized")) return null; string[] instances = sOutput.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); List<string> lstInstances = new List<string>(); foreach (var item in instances) { if (item.Trim().Length > 0) lstInstances.Add(item); } return lstInstances; }
    

0
投票
    如果您将应用程序安装在 C: 驱动器中,请转到安装应用程序的路径,然后将父目录设置为完全控制,因为您无法访问文件 db 并在其中写入
  1. 或者将您的应用程序安装在他有完全控制权的其他路径中
© www.soinside.com 2019 - 2024. All rights reserved.