【问题标题】:How to restore SQL localDB programmatically如何以编程方式恢复 SQL localDB
【发布时间】:2017-02-17 21:17:28
【问题描述】:

我正在尝试为我的 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();
}

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

Restore db failed System.Data.SqlClient.SqlException(0X80131904):userdoesnot have permission to alter database BbCon.mdf 数据库不存在或数据库未处于允许访问检查的状态。

谁能帮帮我?

【问题讨论】:

  • 这是一个本地数据库,只需断开与它的连接并使用 System.IO 命令(如 FileStream)复制文件。然后要恢复它,只需用备份的副本覆盖 MDB。我不相信本地 db mdb 文件有系统/主表等,或者备份/恢复命令对它们有效。
  • @Ryan Mann,localDB 是 MDF,也有标准的备份/恢复命令。但是有些部分是正确的,当我们只需要一份 MDF 的副本(而不是备份)时,我们需要停止服务器并只复制..
  • 并且“ALTER DATABASE”需要以管理员身份连接到主数据库(Integrated Security=True)。那么有权限的异常信息就解决了。

标签: c# sql-server restore localdb


【解决方案1】:

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

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

请尝试上述更改。

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

希望你有美好的日子!谢谢!

【讨论】:

  • 感谢您的代码,但是当我尝试上面的代码时,我收到一个错误 error-50 数据库运行时错误,提供的数据库实例名称无效,您能帮帮我吗
  • 备份已恢复,但在我发布并在客户端系统中使用后,我收到错误数据库已使用无法恢复
  • 在恢复之前,尝试 'ALTER DATABASE ROLLBACK IMMEDIATE',正如我在备份代码中显示的那样。这将完成所有未完成的事务,就像'在我们备份之前从数据库中移交'。换句话说,在我们关闭餐厅之前,如果我们不宣布这家餐厅将要关闭,如果我们突然关闭餐厅,即使餐厅关闭,一些顾客可能仍然有食物。资料目录|参考我对另一个问题的回答。 stackoverflow.com/questions/42322388/…
  • ALTER DATABASE ROLLBACK IMMEDIATE 扮演着这样的角色。
猜你喜欢
  • 2014-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多