#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.
Затем удалите нарушителя, установив флажок «Закрыть существующие соединения»
Ответ №4:
У меня тоже была такая же проблема. Ранее я удалил (вырезал) базу данных в mysqlserver2012 и скопировал ее в папку моего приложения. После того, как я создал свое приложение, я получил эту ошибку и решил ее, удалив Initial Catalog
часть моей строки подключения.
Ваша окончательная строка подключения должна выглядеть примерно так:
Data Source=<your server name>;AttachDbFileName=database pathdatabaseName.mdf;Integrated Security=True" ";User Instance=True" ";Context Connection=False;