C# 无法连接到本地数据库SQL

C# 无法连接到本地数据库SQL,c#,sql,sql-server,database-connection,local,C#,Sql,Sql Server,Database Connection,Local,我用SQL Server(本地数据库)创建的本地数据库有问题。 我可以连接到我计算机上的数据库,但如果我尝试连接到另一台计算机,我会收到以下错误消息: 我想要一个本地数据库来存储数据,我不需要服务器来管理数据库。 这是我的连接字符串: `<connectionStrings> <add name="stocksDB" connectionString="Data Source= (LocalDB)\MSSQLLocalDB;AttachDbFilename=|Data

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

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

这是我的连接字符串:

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

我做错了什么?

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

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

请注意,在下面的示例中,安装SQL时使用了“默认”实例名称(MSSQLSERVER)。如果DB实例名称是默认名称,则不能显式提供实例名称(如果提供,则会显示错误)。只有当实例名称不是默认实例名称时,才显式提供实例名称。下面的代码可以处理任何一种情况(通过将dbInstanceName变量设置为“”或实例名称,例如“\SQLEXPRESS”)。请参阅S.O.。如果有疑问,请尝试一个空的实例名和一个您认为是实例名的名称,以查看其效果

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

解决了!问题是另一台计算机上的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;
        }
var instances=GetLocalDBInstances();
var connString=string.Format(“数据源=(LocalDB)\\{0};AttachDbFilename=\\\数据目录\\\\myDB.mdf;集成安全性=True;”,实例[0]);
内部静态列表GetLocalDBInstances()
{
//启动子进程。
过程p=新过程();
//重定向子进程的输出流。
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();
//不要等到子进程退出后再启动
//读取到其重定向流的末尾。
//p.WaitForExit();
//首先读取输出流,然后等待。
字符串sOutput=p.StandardOutput.ReadToEnd();
p、 WaitForExit();
//如果未安装LocalDb,则返回“sqllocaldb”未被识别为内部或外部命令可操作程序或批处理文件。
if(sOutput==null | | sOutput.Trim().Length==0 | | sOutput.Contains(“未识别”))
返回null;
string[]instances=sOutput.Split(新字符串[]{Environment.NewLine},StringSplitOptions.None);
List LSTANCES=新列表();
foreach(实例中的var项)
{
如果(item.Trim().Length>0)
1.增加(项目);
}
返回实例;
}

LocalDB是一个…本地数据库。它不打算像服务器解决方案那样在机器之间共享。这是我第一次在.NET上使用数据库,我会有一个本地数据库,它只在运行我的软件的计算机上工作。我用它来存储数据。我应该怎么做?谢谢你在同一个pa中安装MDF在您的上下文中,这是由| DataDirectory |指向的路径。通常(除非通过代码更改)此目录与您的可执行文件位于桌面应用程序或web项目中的app_数据文件夹中的目录相同。请记住,数据库进程需要对此文件和文件夹具有读/写权限。这会对可执行文件夹通常具有写保护的桌面应用程序产生影响。谢谢,MDF文件位于同一目录我的exe文件所在的目录。当我在我的计算机上测试它时,在VisualStudio外部启动exe文件,但在我的另一台计算机上,即使有所有权限,也不能运行。我也将在我朋友的计算机上尝试。尝试添加你的PC IP地址,而不是LocalDB。我不需要服务器,我需要在我的软件所在的每台计算机上运行一个本地数据库tware正在运行