База данных уже существует. Выберите другое имя с помощью CreateDatabase()

#c# #linq #mdf

#c# #linq #mdf

Вопрос:

У меня возникла проблема, и в то же время я кое-что узнал….

Я создал DBML из существующей базы данных сервера.

Из DBML я хотел создать локальную базу данных (файл .mdf). Я создал базу данных using DataContext.CreateDatabase("C:xxxx.mdf") .

Затем я решил удалить его (ВРУЧНУЮ, что, очевидно, плохо), потому что, когда я пытаюсь воссоздать базу данных с тем же именем (даже если файлы удалены), я получаю сообщение об ошибке База данных уже существует. Выберите другое имя с помощью CreateDatabase()

Я попытался просмотреть реестр, но безуспешно… Я попытался выполнить поиск файла по всему жесткому диску.. не повезло.

После поиска в Google я обнаружил, что вы удаляете базу данных, которая была создана с помощью CreateDatabase() with DeleteDatabase() …. Затем вы можете воссоздать базу данных снова.

Проблема в том, что теперь я все еще не могу воссоздать старую базу данных, потому что система считает, что имя уже существует.

Есть ли способ избавиться от упоминаний старого файла базы данных «не существует»

Комментарии:

1. когда вы удаляли ее вручную, вы удаляли как mdf, так и ldf? Кроме того, какую ошибку вы получаете при вызове DeleteDatabase() сейчас?

2. Когда я пытаюсь DeleteDatabase(), я получаю это: System.Data.SqlClient.SQLException: попытка прикрепить базу данных с автоматическим именем для файла C:xxxx.mdf сбой. База данных с таким же именем существует, или указанный файл не может быть открыт, или он находится на общем ресурсе UNC..

Ответ №1:

Вам нужно открыть основную базу данных через server explorer в Visual Studio (Добавить новое соединение Выбрать master базу данных), затем добавить New query , ввести Drop Database xxxx и выполнить ее. Вы также можете использовать Sql Server Management Studio.

Комментарии:

1. Я тоже столкнулся с той же проблемой. Возможно ли сделать то, что вы предложили программно?

2. На случай, если кому-то интересно то же самое, да, вы можете сделать это программно. Просто подключитесь к базе данных в вашем коде, затем отправьте соответствующую инструкцию SQL для выполнения ( drop database xxxx ).

Ответ №2:

Решение (через здесь) заключается в использовании SSEUtil для отсоединения существующей базы данных:

 try
{
    // open a connection to the database for test
}
catch (SystemException ex) // Change exception type based on your underlying data provider
{
    if (ex.Message.ToLower().Contains("already exists. choose a different database name"))
    {
        var match = Regex.Match(ex.Message, "database '(.*)' already exists.", 
           RegexOptions.IgnoreCase);

        if (match.Success)
        {
            String dbFileName = match.Groups[1].Value;
            Process p = new Process();
            p.StartInfo.UseShellExecute = true;
            p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            p.StartInfo.FileName = String.Format("{0}/Tools/SSEUtil.exe", 
              Environment.CurrentDirectory);
            p.StartInfo.WorkingDirectory = Environment.CurrentDirectory;
            p.StartInfo.Arguments = String.Format("-d "{0}"", dbFileName);

            p.Start();
        }
    }
}
  

Комментарии:

1. 1 Я столкнулся с этой проблемой при программном развертывании баз данных SQL Server с классами Linq to SQL. Не уверен, почему база данных остается подключенной после того, как приложение существует, однако этому инструменту удается отсоединить базу данных. Если у кого-нибудь есть идеи, как предотвратить эту проблему в первую очередь и, следовательно, устранить необходимость в этом решении, было бы здорово. Кстати, спасибо за решение.

Ответ №3:

Вот быстрое исправление проблемы с LocalDB. Просто подключитесь к (localdb)MSSQLLocalDB в SQL Mgmt. Studio / Visual Studio.

Подключение к SQL Server

Затем удалите нарушителя, установив флажок «Закрыть существующие соединения»

введите описание изображения здесь

Ответ №4:

У меня тоже была такая же проблема. Ранее я удалил (вырезал) базу данных в mysqlserver2012 и скопировал ее в папку моего приложения. После того, как я создал свое приложение, я получил эту ошибку и решил ее, удалив Initial Catalog часть моей строки подключения.

Ваша окончательная строка подключения должна выглядеть примерно так:

Data Source=<your server name>;AttachDbFileName=database pathdatabaseName.mdf;Integrated Security=True" ";User Instance=True" ";Context Connection=False;