【问题标题】:how to backup and restore mdf file in winform C# after deployment project?部署项目后如何在winform C#中备份和恢复mdf文件?
【发布时间】:2019-08-24 22:41:18
【问题描述】:

我正在 c# Visual Studio 2013 中开发一个桌面应用程序,我想在其中创建一个允许用户自行恢复和备份数据库的功能。但问题是部署项目后它不会备份或恢复数据库。

当我尝试备份时,它说!

数据库“DatabaseName”没有退出。请确保输入的名称正确。 BACKUP DATABASE 异常终止。

当我尝试恢复数据库时,它说

System.Data.Sqlclient.SqlException (0x80131904): 用户无权更改数据库.mdf',数据库不退出,或数据库未处于允许访问检查的状态。等等!

我通过将 mdf 文件附加到应用程序来使用 SQL Server Express 2012,当我尝试使用查询进行备份时,当我通过 SQL Server 添加连接字符串时它可以工作,但在附加 mdf 文件后我将无法工作。

看过一些教程视频并想出了一些代码,但我什么也没得到

这是我的备份代码!

private void buttonbackup_Click(object sender, EventArgs e)
{
    try
    {

         SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\neyadatabase.mdf;Integrated Security=True;Connect Timeout=30");
         con.Open();

         String sql = "BACKUP DATABASE neyadatabase TO DISK = '" + backuploca.Text + "\\neyadatabase - " + DateTime.Now.Ticks.ToString() + ".Bak'";
          SqlCommand cmd = new SqlCommand(sql, con);
          cmd.ExecuteNonQuery();
          MessageBox.Show("backup done successfully!");
          con.Close();
          con.Dispose();
      }

      catch (Exception ex)
      {
          MessageBox.Show(ex.Message);
      }  
}

这是我的恢复代码!

private void buttonrestore_Click(object sender, EventArgs e)
{

    try
    {

         SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\neyadatabase.mdf;Integrated Security=True;Connect Timeout=30");
         con.Open();
         string sqlStmt2 = string.Format("ALTER DATABASE [neyadatabase.mdf] SET SINGLE_USER WITH ROLLBACK IMMEDIATE");
         SqlCommand bu2 = new SqlCommand(sqlStmt2, con);
         bu2.ExecuteNonQuery();

         string sqlStmt3 = "USE MASTER RESTORE DATABASE [neyadatabase.mdf] FROM DISK='" + restoreloca.Text + "'WITH REPLACE;";
         SqlCommand bu3 = new SqlCommand(sqlStmt3, con);
         bu3.ExecuteNonQuery();

         string sqlStmt4 = string.Format("ALTER DATABASE [neyadatabase.mdf] SET MULTI_USER");
         SqlCommand bu4 = new SqlCommand(sqlStmt4, con);
         bu4.ExecuteNonQuery();

         MessageBox.Show("database restoration done successefully");
         con.Close();

      }
      catch (Exception ex)
      {
         MessageBox.Show(ex.ToString());
      }


}

我是这方面的初学者,如果有人要帮助我,请也举一些例子,以便我更好地理解!

谢谢

【问题讨论】:

    标签: c# sql winforms backup restore


    【解决方案1】:

    用于备份:

    private void buttonbackup_Click(object sender, EventArgs e)
    {
        try
        {
            using (SqlConnection dbConn = new SqlConnection())
            {
                 dbConn.ConnectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;Database=neyadatabase;Integrated Security=True;Connect Timeout=30;";
                 dbConn.Open();
    
                 using (SqlCommand multiuser_rollback_dbcomm = new SqlCommand())
                 {
                     multiuser_rollback_dbcomm.Connection = dbConn;
                     multiuser_rollback_dbcomm.CommandText= @"ALTER DATABASE neyadatabase SET MULTI_USER WITH ROLLBACK IMMEDIATE";
    
                     multiuser_rollback_dbcomm.ExecuteNonQuery();
                 }
                 dbConn.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 neyadatabase TO DISK='c:\neyadatabase.bak'";
                    backupcomm.ExecuteNonQuery();
                }
                backupConn.Close();
            }
        }
    
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }  
    }
    

    对于恢复:

    private void buttonrestore_Click(object sender, EventArgs e)
    {
        try
        {
            using (SqlConnection restoreConn = new SqlConnection())
            {
                restoreConn.ConnectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;Database=neyadatabase;Integrated Security=True;Connect Timeout=30;";
                restoreConn.Open();
                using (SqlCommand restoredb_executioncomm = new SqlCommand())
                {
                    restoredb_executioncomm.Connection = restoreConn;
                    restoredb_executioncomm.CommandText = @"RESTORE DATABASE neyadatabase FROM DISK='c:\neyadatabase.bak'";
    
                    restoredb_executioncomm.ExecuteNonQuery();
                }
                restoreConn.Close();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
    
    • 备份和恢复bak 文件。 Mdf/ldf 用于附加而非备份。

    我希望这对你有帮助。 如果您遇到任何问题,请告诉我以更新我的答案;)。祝你好运

    【讨论】:

    • 它说!用户无权更改数据库“neyadatabase”,数据库未退出,或数据库未处于允许访问检查的状态。 ALTER DATABASE 语句失败。
    • @BasitM 您是否授予数据库用户权限?当用户没有所需的权限时会发生这种情况。检查这些:dba.stackexchange.com/q/59748/122901dba.stackexchange.com/q/102577/122901
    • 恢复使用!它也不起作用:(我应该创建新项目再试一次吗?还是有办法解决这个问题?
    • Ofc 有办法解决这个问题,请尝试检查数据库用户权限并告诉我。
    • 好吧,让我先了解一下!我需要在 SQL Query 中授予我的数据库权限,然后我将从 C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\DATA 复制数据库文件以在我的项目中附加 Database.mdf 文件?对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多