Невозможно подключиться к локальной базе данных SQL - PullRequest
0 голосов
/ 28 апреля 2018

У меня проблема с моей локальной базой данных, созданной с помощью 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 голосов
/ 29 апреля 2018

Решено! Проблема была в неправильной версии 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;
        }
0 голосов
/ 28 апреля 2018

Если у вас есть два компьютера (скажем, их имена компьютеров «pc_a» и «pc_b», которые объединены в сеть, и программа работает на компьютере «pc_a», а база данных находится на компьютере «pc_b»), то ваша строка подключения необходимо указать имя компьютера для компьютера "pc_b".

Вы можете указать имя компьютера, даже если это локальный компьютер, поэтому приведенный ниже код будет работать, если программа работает на том же компьютере, что и база данных, или если программа работает на одном компьютере, а база данных - на другом. до тех пор, пока две машины объединены в сеть и учетная запись, под которой вы запускаете программу, имеет доступ к машине, экземпляру и базе данных.

Обратите внимание, что в приведенном ниже примере имя экземпляра по умолчанию (MSSQLSERVER) использовалось при установке SQL. Если имя экземпляра БД является именем по умолчанию, вы не должны явно указывать имя экземпляра (вы получите ошибку, которую вы показали, если вы это сделаете). Единственный раз, когда вы предоставляете имя экземпляра в явном виде, это когда оно не является именем экземпляра по умолчанию. Приведенный ниже код может обрабатывать любой сценарий (установив для переменной dbInstanceName значение "" или имя экземпляра, например "\ SQLEXPRESS"). Смотри С.О. 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"))
{
   .
   .
   .
}
...