如何以编程方式还原SQL localDB

时间:2017-02-17 21:17:29

标签: c# sql-server restore localdb

我正在尝试为我的Windows表单应用程序创建备份和还原功能。

所以,我试图进行数据库恢复。我的代码是这样的:

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

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

  

恢复数据库失败System.Data.SqlClient.SqlException(0X80131904):userdoes无权更改数据库BbCon.mdf数据库不存在或者数据库未处于允许访问检查的状态。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:5)

您是要尝试备份还是还原?您在标题中提到备份,而命令用于恢复。

还没有很多本地数据库的示例案例。

使用我的代码如下。希望这会有所帮助..

备份 -

str.split("").length

还原 -

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

更新 -

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

请尝试以上改变。

根据我的经验,如果我写了“数据目录”,请提供您的信息在我的connectionString中,我只能读取(SQL SELECT命令)数据库。换句话说,可以完成插入和更新命令,但实际上没有插入或更新数据库而没有任何异常。我认为设置为|数据目录|将数据库设置为只读,我发现有些人在使用数据库插入或更新数据库时遇到了困难。设置。

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