无法连接到本地数据库SQL

时间:2018-04-28 18:38:21

标签: c# sql sql-server database-connection local

我的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

我做错了什么?

2 个答案:

答案 0 :(得分:1)

如果您有两台计算机(假设他们的计算机名称为&#34; pc_a&#34;&#34; pc_b&#34;它们联网在一起并且程序在计算机上运行&#34; pc_a&#34 ;并且数据库驻留在计算机&#34; pc_b&#34;上,然后您的连接字符串需要包含计算机的机器名称&#34; pc_b&#34;。

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

请注意以下示例中的&#34;默认&#34;安装SQL时使用实例名称(MSSQLSERVER)。当数据库实例名称是默认名称时,您不能明确提供实例名称(如果您这样做,您将收到您显示的错误)。您明确提供实例名称的唯一时间是它不是默认实例名称。下面的代码可以处理任一场景(通过将dbInstanceName变量设置为&#34;&#34;或实例名称,例如&#34; \ SQLEXPRESS&#34;)。见S.O. SQL Server: How to find all localdb instance names。如果有疑问,请尝试一个空实例名称和一个您认为是实例名称的名称,以查看哪些有效。

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"))
{
   .
   .
   .
}

答案 1 :(得分:0)

解决!问题是另一台计算机上的SQL Server版本错误。在我的主计算机上,我有SQL Server 2014,另一个是2012版本,所以“数据库实例名称”是不同的。感谢@Nova Sys Eng的投入!

现在我改变了我的连接字符串: 首先,我使用代码检索计算机上安装的所有SQL服务器实例,如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;
        }