2017-02-17 28 views
2

我正在尝试为Windows窗体应用程序创建备份和恢复功能。如何以编程方式恢复SQL本地数据库

所以,我试图做一个数据库恢复。我的代码是这样的:

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。 我不相信本地数据库mdb文件有系统/主表等,或者备份/恢复命令将在他们的工作。 –

+0

@Ryan Mann,localDB是MDF,也有标准的备份/恢复命令。但有些部分是正确的,当我们只需要一份MDF(不是备份)时,我们需要停止服务器并且仅仅复制。 –

+0

而'ALTER DATABASE'需要以管理员身份连接到主数据库(集成安全= TRUE)。那么具有权限的异常消息将被解决。 –

回答

4

您是否正在备份或恢复?您在标题中提到了备份,并且该命令用于恢复。

对于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(); 
} 

更新 -

哎呀,对不起,我的代码是SQL的LocalDB 2014但似乎你'使用2012. 请将(LocalDB)\ MSSQLLocalDB替换为(LocalDB)\ v11.0

只要尝试一下上面的更改。

根据我的经验,如果我写了|数据目录|在我的connectionString中,我只能读取(SQL SELECT命令)数据库。换句话说,插入和更新命令可以完成,但是没有任何例外,数据库没有被插入或更新。我认为设置为|数据目录|会将数据库设置为只读,我发现有些人在使用|数据目录|插入或更新数据库时遇到困难设置。

希望你的美好时光!谢谢 !

+0

感谢您的代码,但是当我试着上面的代码我得到一个错误的错误-50数据库运行时错误提供的数据库实例名称无效可以请你帮我 –

+0

你能帮我 –

+0

当然,如果人们真的需要帮助... Kindly被建议为我更新的答案。谢谢 ! –

相关问题