2014-12-20 4 views
0

Я использовал базовый метод 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 не позволяет мне ответить на мой собственный вопрос, поэтому я должен записать его здесь.

Прежде всего, вы должны проверить фактическое имя вашей базы данных, это не обязательно имя файла базы данных. Для этого вам необходимо:

  1. Открыть проводник сервера в Visual Studio или SQL Management Studio.
  2. Открыть новый запрос.
  3. Выполните следующий запрос: SELECT, имя, create_date ИЗ sys.databases
  4. Проверьте имя базы данных (в моем случае это был полный путь к файлу базы данных, это может быть только имя базы данных . или что-нибудь еще)

Затем вы можете изменить название столбцов и таблиц, выполнив следующий код:

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'.

ответ

1

Если вы используете Ef6 вы можете попробовать этот код :

string command = "EXEC sp_detach_db 'TableGraphDB', 'true'"; 
dbContext.ExecuteStoreCommand(command); 

Второй параметр в sp_detach_db процедуры будет отбрасывать все подключения к этой базе данных

+0

Я попробовал это раньше. По какой-то причине он не распознает мою базу данных! – Bopy

+1

вот аналогичная дискуссия http://stackoverflow.com/questions/25942471/detach-database-programmatically – opewix

+0

Ваша вторая строка неверна, вы должны использовать ctx.Database.ExecuteSqlCommand (команда); – Bopy

1

В SSMS это запрос, который используется для отсоединения базы данных. Можете ли вы попробовать это?

Вы должны просто иметь возможность обернуть все это как строку и выполнить ее. Я не уверен, что он будет доволен «GO», поэтому вам, возможно, придется их удалить.

string detachQ = "" + 
"USE [master]\n" + 
"GO\n" + 
"ALTER DATABASE [TableGraphDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE\n" + 
"GO\n" + 
"USE [master]\n" + 
"GO\n" + 
"EXEC master.dbo.sp_detach_db @dbname = N'TableGraphDB'\n" + 
"GO\n"; 

ctx.Database.ExecuteSqlCommand(detachQ); 
+0

Как его использовать в ctx.Database.ExecuteSqlCommand (detachQ); или каким-либо другим способом, чтобы я мог отсоединить базу данных во время выполнения? – Bopy

+0

Я обновил свой ответ – Spock

+0

С Go Я получаю синтаксическую ошибку. Когда я удаляю Go, я получаю следующую ошибку: оператор ALTER DATABASE не допускается в транзакции с несколькими операторами. 2. База данных «TableGraphDB» не существует. Введите действительное имя базы данных. Чтобы просмотреть доступные базы данных, используйте sys.databases. 3. Изменен контекст базы данных на «master». – Bopy

Смежные вопросы