2017-02-17 4 views
2

Я пытаюсь создать функцию резервного копирования и восстановления в моем приложении формы Windows.Как восстановить SQL localDB программно

Итак, я попытался восстановить базу данных. Мой код выглядит так:

string cbdfilename = "c:\\Users\\Public\\Public Document"; 
SqlConnection.ClearAllPools(); 
SqlConnection con = new SqlConnection("Data Source=(LocalDB)\\v11.0;AttachDbFilename=|DataDirectory|\\BbCon.mdf;Integrated Security=True;Connect Timeout=30;"); 
string sql; 

sql = "Use master;Alter Database BbCon Set Single_User With Rollback Immediate;Restore Database BbCon From Disk = @FILENAME With Replace;Alter Database BbCon Set Multi_User;"; 

SqlCommand cmd = new SqlCommand(sql, con); 
cmd.Parameters.AddWithValue("@FILENAME", cbdfilename); 

con.Open(); 

try 
{ 
    cmd.ExecuteNonQuery(); 
} 
catch(Exception ex) 
{ 
    MessageBox.Show("Restore DB failed" + ex.ToString()); 
} 
finally 
{ 
    con.Close(); 
    con.Dispose(); 
} 

Но когда я пытаюсь запустить это, я получаю сообщение об ошибке:

Restore db failed System.Data.SqlClient.SqlException(0X80131904):userdoesnot have permission to alter database BbCon.mdf the database doesnot exist or or datbase is not in a state that allows access checks.

Может кто-нибудь мне помочь, пожалуйста?

+0

Это локальная БД, просто отсоедините ее и скопируйте файл с помощью команд System.IO, таких как FileStream. Затем, чтобы восстановить его, просто перезапишите MDB с копией резервной копии. Я не верю, что локальные файлы db mdb имеют системные/главные таблицы и т. Д., Или что команды резервного копирования/восстановления будут работать на них. –

+0

@ Ryan Mann, localDB - MDF, а также имеет стандартную команду резервного копирования/восстановления. Но некоторая часть верна, когда нам нужна только копия MDF (не резервная копия), нам необходимо остановить сервер и просто скопировать .. –

+0

И «ALTER DATABASE» требует подключения к Master Database в качестве администратора (Integrated Security = True). Затем сообщение об исключении с разрешениями будет разрешено. –

ответ

4

Вы пытаетесь выполнить резервное копирование или восстановление? Вы упоминаете Резервное копирование в заголовке, а commmand - для Восстановления.

Есть еще не так много примеров для localDB.

Используйте мой код, как показано ниже. Надеюсь, что это помогает ..

Для Подпорки

string master_ConnectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;Database=Master;Integrated Security=True;Connect Timeout=30;"; 

using (SqlConnection masterdbConn = new SqlConnection()) 
{ 
    masterdbConn.ConnectionString = master_ConnectionString; 
    masterdbConn.Open(); 

    using (SqlCommand multiuser_rollback_dbcomm = new SqlCommand()) 
    { 
     multiuser_rollback_dbcomm.Connection = masterdbConn; 
     multiuser_rollback_dbcomm.CommandText= @"ALTER DATABASE yourdbname SET MULTI_USER WITH ROLLBACK IMMEDIATE"; 

     multiuser_rollback_dbcomm.ExecuteNonQuery(); 
    } 
    masterdbConn.Close(); 
} 

SqlConnection.ClearAllPools(); 

using (SqlConnection backupConn = new SqlConnection()) 
{ 
    backupConn.ConnectionString = yourConnectionString; 
    backupConn.Open(); 

    using (SqlCommand backupcomm = new SqlCommand()) 
    { 
     backupcomm.Connection = backupConn; 
     backupcomm.CommandText= @"BACKUP DATABASE yourdbname TO DISK='c:\yourdbname.bak'"; 
     backupcomm.ExecuteNonQuery(); 
    } 
    backupConn.Close(); 
} 

Для Restore-

string master_ConnectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;Database=Master;Integrated Security=True;Connect Timeout=30;"; 

using (SqlConnection restoreConn = new SqlConnection()) 
{ 
    restoreConn.ConnectionString = master_ConnectionString; 
    restoreConn.Open(); 

    using (SqlCommand restoredb_executioncomm = new SqlCommand()) 
    { 
     restoredb_executioncomm.Connection = restoreConn; 
     restoredb_executioncomm.CommandText = @"RESTORE DATABASE yourdbname FROM DISK='c:\yourdbname.bak'"; 

     restoredb_executioncomm.ExecuteNonQuery(); 
    } 
    restoreConn.Close(); 
} 

update-

К сожалению, извините, мой код для SQL LocalDB 2014, но вам кажется с использованием 2012 года. Нежелательная замена (LocalDB) \ MSSQLLocalDB на (LocalDB) \ v11.0

И любезно попробуйте с изменением.

И для вашей информации, согласно моему опыту, если бы я написал | Каталог данных | в моем соединенииString я мог только читать (SQL SELECT команду) в базе данных. Другими словами, команды Insert и Update могут быть выполнены, но база данных не была вставлена ​​или обновлена ​​на самом деле без каких-либо исключений. Я думаю, что установка как | Каталог данных | сделает базу данных доступной только для чтения, и я обнаружил, что некоторые люди испытывали трудности с вставкой или обновлением базы данных с помощью | Data Directory | установка.

Надеюсь, что у вас хорошие дни! Благодаря !

+0

спасибо за код, но когда я пробовал код выше, я получаю ошибку error-50 database runtime error предоставлено имя экземпляра базы данных недопустимо, можете ли вы мне помочь –

+0

вы можете мне помочь –

+0

Конечно, если люди действительно нуждаются в помощи ... Просьба как мой обновленный ответ. Благодаря ! –

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