繁体   English   中英

如何通过C#代码还原SQL Server数据库

[英]How to restore SQL Server database through C# code

我尝试像这样还原数据库:

SQL = @"RESTORE DATABASE MyDataBase TO DISK='d:\MyDATA.BAK'";
                Cmd = new SqlCommand(SQL, Conn);
                Cmd.ExecuteNonQuery();
                Cmd.Dispose();

但我总是得到错误:

Msg 3102,第16级,状态1,第7行
RESTORE无法处理数据库“ MyDataBase”,因为此会话正在使用它。 建议执行此操作时使用master数据库。
Msg 3013,第16级,状态1,第7行
RESTORE DATABASE异常终止。

我更喜欢使用SMO还原备份:

Microsoft.SqlServer.Management.Smo.Server smoServer = 
     new Server(new ServerConnection(server));

Database db = smoServer.Databases['MyDataBase'];
string dbPath = Path.Combine(db.PrimaryFilePath, 'MyDataBase.mdf');
string logPath = Path.Combine(db.PrimaryFilePath, 'MyDataBase_Log.ldf');
Restore restore = new Restore();
BackupDeviceItem deviceItem = 
    new BackupDeviceItem('d:\MyDATA.BAK', DeviceType.File);
restore.Devices.Add(deviceItem);
restore.Database = backupDatabaseTo;
restore.FileNumber = restoreFileNumber;
restore.Action = RestoreActionType.Database;
restore.ReplaceDatabase = true;
restore.SqlRestore(smoServer);

db = smoServer.Databases['MyDataBase'];
db.SetOnline();
smoServer.Refresh();
db.Refresh();

您将需要引用Microsoft.SqlServer.Smo,Microsoft.SqlServer.SmoExtended和Microsoft.SqlServer.Management.Sdk.Sfc

您的数据库连接很可能与您要还原的数据库建立连接。 因此,有一个数据库共享锁可以防止还原数据库

尝试这个

SQL = @"USE master BACKUP DATABASE MyDataBase TO DISK='d:\MyDATA.BAK'";

或更改连接详细信息以使用主数据库

 public void Restore(string Filepath)
        {
            try
            {
                if(con.State == ConnectionState.Closed)
                {
                    con.Open();
                }
                SqlCommand cmd1 = new SqlCommand("ALTER DATABASE [" + Database + "] SET SINGLE_USER WITH ROLLBACK IMMEDIATE ", con);
                cmd1.ExecuteNonQuery();
                SqlCommand cmd2 = new SqlCommand("USE MASTER RESTORE DATABASE [" + Database + "] FROM DISK='" + Filepath + "' WITH REPLACE", con);
                cmd2.ExecuteNonQuery();
                SqlCommand cmd3 = new SqlCommand("ALTER DATABASE [" + Database + "] SET MULTI_USER", con);
                cmd3.ExecuteNonQuery();
                con.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            con.Close();
        }

您必须通过其他数据库连接到数据库服务器。

因此,您的连接字符串应使您说“ Master”或服务器上的另一个数据库,然后即可完成手头的任务。

您的连接字符串应具有一个master数据库作为要连接的默认目录。

我已经结束了这个解决方案。 我的数据库名称为Stats,无需安装MSSQL Management Studio即可使用

    public void BackUpDB(string fname)
    {
        using (SqlConnection cn = new SqlConnection(_cstr))
        {
            cn.Open();
            string cmd = "BACKUP DATABASE [Stats] TO DISK='" + fname + "'";
            using (var command = new SqlCommand(cmd, cn))
            {
                command.ExecuteNonQuery();
            }
        }
    }

    public void RestoreDB(string fname)
    {
        using (SqlConnection cn = new SqlConnection(_cstr))
        {
            cn.Open();
            #region step 1 SET SINGLE_USER WITH ROLLBACK
            string sql = "IF DB_ID('Stats') IS NOT NULL ALTER DATABASE [Stats] SET SINGLE_USER WITH ROLLBACK IMMEDIATE";
            using (var command = new SqlCommand(sql, cn))
            {
                command.ExecuteNonQuery();
            }
            #endregion
            #region step 2 InstanceDefaultDataPath

            sql = "SELECT ServerProperty(N'InstanceDefaultDataPath') AS default_file";
            string default_file = "NONE";
            using (var command = new SqlCommand(sql, cn))
            {
                using (var reader = command.ExecuteReader())
                {
                   if (reader.Read())
                    {
                        default_file = reader.GetString(reader.GetOrdinal("default_file"));
                    }
                }
            }
            sql = "SELECT ServerProperty(N'InstanceDefaultLogPath') AS default_log";
            string default_log = "NONE";
            using (var command = new SqlCommand(sql, cn))
            {
                using (var reader = command.ExecuteReader())
                {
                    if (reader.Read())
                    {
                        default_log = reader.GetString(reader.GetOrdinal("default_log"));
                    }
                }
            }
            #endregion
            #region step 3 Restore
            sql = "USE MASTER RESTORE DATABASE [Stats] FROM DISK='" + fname + "' WITH  FILE = 1, MOVE N'Stats' TO '" + default_file + "Stats.mdf', MOVE N'Stats_Log' TO '"+ default_log+ "Stats_Log.ldf', NOUNLOAD,  REPLACE,  STATS = 1;";
            using (var command = new SqlCommand(sql, cn))
            {
                command.ExecuteNonQuery();
            }
            #endregion
            #region step 4 SET MULTI_USER
            sql = "ALTER DATABASE [Stats] SET MULTI_USER";
            using (var command = new SqlCommand(sql, cn))
            {
                command.ExecuteNonQuery();
            }
            #endregion
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM