Я использовал базовый метод EF для создания модели в приложении wpf с использованием C#. Добавив соответствующую информацию, изменив имена столбцов, имена таблиц, я хочу скопировать их в новое место. Но я получаю сообщение об ошибке, что база данных используется.Как отделить базу данных, чтобы ее можно было скопировать или переместить?
using (var ctx = new TableGraphDBEntities())
{
for (int l = 0, m = 1; l < TableNames.Count; l++, m++)
{
string columnxQ = "sp_rename 'Table1.x','" + XNames[l] + "', 'COLUMN'";
string columnyQ = "sp_rename 'Table1.y','" + YNames[l] + "', 'COLUMN'";
string talbeQ = "sp_rename Table" + m.ToString() + "," + TableNames[l];
string detachQ = "sp_detach_db @dbname = N'TableGraphDB'";
//string setOffline = "
//string detachQ = "USE master; GO EXEC sp_detach_db @dbname = N'TableGraphDB'; GO";
ctx.Database.ExecuteSqlCommand(columnxQ);
ctx.Database.ExecuteSqlCommand(columnyQ);
ctx.Database.ExecuteSqlCommand(talbeQ);
ctx.Database.ExecuteSqlCommand(detachQ);
}
}
string oldFilePath = System.AppDomain.CurrentDomain.BaseDirectory + "TableGraphDB.mdf";
string FilePath = Properties.Settings.Default.ExtensionFileDir + @"\Saved DataBases\" + fnw.FileName + ".mdf";
if (File.Exists(FilePath))
{
MessageBox.Show("The database aleady exist, please type a different name");
return;
}
//FileInfo fileInfo = new FileInfo(oldFilePath);
//while (IsFileLocked(fileInfo))
//{
//}
File.Copy(oldFilePath, FilePath);
MessageBox.Show("Database is saved!");
Вот ссылка на команду SLQ http://msdn.microsoft.com/en-gb/library/ms187858.aspx
База данных находится в папке Bin. Он копируется как новая копия проекта каждый раз, когда я запускаю приложение. Если я закрою приложение и снова открою его, его можно скопировать со всеми данными.
Я попытался использовать ExecuteSqlCommand(), но это не помогло. Итак, как я мог отсоединить базу данных, чтобы я мог ее переместить/скопировать?
К сожалению, StackOverFlow не позволяет мне ответить на мой собственный вопрос, поэтому я должен записать его здесь.
Прежде всего, вы должны проверить фактическое имя вашей базы данных, это не обязательно имя файла базы данных. Для этого вам необходимо:
- Открыть проводник сервера в Visual Studio или SQL Management Studio.
- Открыть новый запрос.
- Выполните следующий запрос: SELECT, имя, create_date ИЗ sys.databases
- Проверьте имя базы данных (в моем случае это был полный путь к файлу базы данных, это может быть только имя базы данных . или что-нибудь еще)
Затем вы можете изменить название столбцов и таблиц, выполнив следующий код:
using (var ctx = new TableGraphDBEntities())
{
for (int l = 0, m = 1; l < TableNames.Count; l++, m++)
{
string columnxQ = "sp_rename 'Table1.x','" + XNames[l] + "', 'COLUMN'";
string columnyQ = "sp_rename 'Table1.y','" + YNames[l] + "', 'COLUMN'";
string talbeQ = "sp_rename Table" + m.ToString() + "," + TableNames[l];
ctx.Database.ExecuteSqlCommand(columnxQ);
ctx.Database.ExecuteSqlCommand(columnyQ);
ctx.Database.ExecuteSqlCommand(talbeQ);
ctx.Dispose();
}
}
и, наконец, использовать следующий код, чтобы отделить и перенести его на новое место :
string oldFilePath = System.AppDomain.CurrentDomain.BaseDirectory + "TableGraphDB.mdf";
string conString = @"Data Source=(LocalDB)\v11.0;Integrated Security=True;";
using (System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(conString))
{
string query = @"USE [master]
ALTER DATABASE ["[email protected]"] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
USE [master]
EXEC master.dbo.sp_detach_db @dbname = N'"+oldFilePath+"'";
SqlCommand cmd = new SqlCommand(query, con);
con.Open();
cmd.ExecuteNonQuery();
cmd.Dispose();
con.Dispose();
}
string FilePath = Properties.Settings.Default.ExtensionFileDir + @"\Saved DataBases\" + fnw.FileName + ".mdf";
if (File.Exists(FilePath))
{
MessageBox.Show("The database aleady exist, please type a different name");
return;
}
File.Copy(oldFilePath, FilePath);
Примечание: При попытке реализовать ctx.Database.ExecuteSqlCommand (запрос), вы получите следующее сообщение об ошибке:
ALTER DATABASE statement not allowed within multi-statement transaction. The procedure 'sys.sp_detach_db' cannot be executed within a transaction. Changed database context to 'master'.
Я попробовал это раньше. По какой-то причине он не распознает мою базу данных! – Bopy
вот аналогичная дискуссия http://stackoverflow.com/questions/25942471/detach-database-programmatically – opewix
Ваша вторая строка неверна, вы должны использовать ctx.Database.ExecuteSqlCommand (команда); – Bopy