如何编程恢复SQL LocalDB



我正在尝试创建备份并恢复Windows Form Application的功能。

所以,我尝试进行数据库还原。我的代码是这样:

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

但是当我尝试运行此问题时,我会收到一个错误:

还原DB失败System.Data.sqlClient.SQLEXCEPTION(0x80131904):UserDoesnot有权更改数据库bbcon.mdf数据库不存在,或者数据库不存在,或者datbase不在状态

任何人可以帮我吗?

您是要备份还是还原?您在标题中提到备份,并且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();
}

用于还原 -

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命令)。换句话说,可以完成插入和更新命令,但是实际上没有插入或更新数据库,没有任何例外。我认为设置为|数据目录|将使数据库成为只读的数据库,我发现有些人很难使用|数据目录插入或更新到数据库|设置。

希望您的美好日子!谢谢!

最新更新