Exemple #1
0
 public static void CancelDbRestore(SQLDMO.Restore oRestore, SQLDMO.RestoreSink_PercentCompleteEventHandler Restore_PercentComplete)
 {
     try
     {
         oRestore.Abort();
         oRestore.PercentComplete -= Restore_PercentComplete;
     }
     catch (Exception e)
     {
         MessageBox.Show("取消数据库还原失败:" + e.Message);
     }
 }
 public static void CancelDbRestore(SQLDMO.Restore oRestore, SQLDMO.RestoreSink_PercentCompleteEventHandler Restore_PercentComplete)
 {
     try
     {
         oRestore.Abort();
         oRestore.PercentComplete -= Restore_PercentComplete;
     }
     catch (Exception e)
     {
         TopFashion.WriteLog.CreateLog("数据库操作", "CancelDbRestore", "error", "取消数据库还原失败:" + e.Message);
     }
 }
        /// < summary>
        /// SQL恢复数据库
        /// < /summary>
        /// <param name="id">备份集ID</param>
        /// <param name="Restore_PercentComplete">进度</param>
        /// <param name="oRestore">数据库还原服务对象</param>
        public static bool SQLDbRestore(int id, SQLDMO.RestoreSink_PercentCompleteEventHandler Restore_PercentComplete, out SQLDMO.Restore oRestore)
        {
            oRestore = null;
            TopFashion.SQLDBHelper SqlHelper = new TopFashion.SQLDBHelper();
            object obj = SqlHelper.GetSingle("select Path from Record where ID=" + id, true);

            if (obj != null && obj != DBNull.Value)
            {
                string filename = obj.ToString();
                SqlConnectionStringBuilder connStrBuilder = new SqlConnectionStringBuilder(TopFashion.Configs.ConnString);
                string ServerIP = connStrBuilder.DataSource;
                if (ServerIP == "." || ServerIP == "(local)" || ServerIP == "127.0.0.1")
                {
                }
                else
                {
                    StringBuilder TargetDir = new StringBuilder();
                    TargetDir.Append(@"\\");
                    TargetDir.Append(ServerIP);
                    TargetDir.Append("\\");
                    TargetDir.Append("DatabaseBackup");
                    TargetDir.Append("\\");
                    filename = TargetDir + Path.GetFileName(filename);
                }
                if (File.Exists(filename))
                {
                    string LoginUserName = connStrBuilder.UserID;
                    string LoginPass     = connStrBuilder.Password;
                    string DBName        = connStrBuilder.InitialCatalog;
                    oRestore = new SQLDMO.RestoreClass();
                    SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
                    try
                    {
                        oSQLServer.LoginSecure = false;
                        oSQLServer.Connect(ServerIP, LoginUserName, LoginPass);
                        //因为数据库正在使用,所以无法获得对数据库的独占访问权。不一定是由于其他进程的占用,还有其他的原因,所以要脱机再联机...
                        //KillProcess(DBName);
                        //KillSqlProcess(oSQLServer, DBName);
                        //OffAndOnLine(DBName);
                        OffLine(DBName);
                        oRestore.Action           = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
                        oRestore.PercentComplete += Restore_PercentComplete;
                        oRestore.Database         = DBName;
                        oRestore.Files            = @"" + string.Format("[{0}]", filename) + "";
                        oRestore.FileNumber       = 1;
                        oRestore.ReplaceDatabase  = true;
                        oRestore.SQLRestore(oSQLServer);//这里可能存在问题!
                        OnLine(DBName);
                        return(true);
                    }
                    catch (Exception e)
                    {
                        TopFashion.WriteLog.CreateLog("数据库操作", "SQLDbRestore", "error", "恢复时出错:" + e.Message);
                    }
                    finally
                    {
                        oSQLServer.DisConnect();
                    }
                }
                else
                {
                    TopFashion.WriteLog.CreateLog("数据库操作", "SQLDbRestore", "error", "找不到要还原的备份数据库文件 [" + filename + "]");
                }
            }
            return(false);
        }
Exemple #4
0
        /// <summary>
        /// SQL恢复数据库
        /// </summary>
        /// <param name="filename">备份集文件的全路径</param>
        /// <param name="connStrBuilder">连接字符串构造器</param>
        /// <param name="Restore_PercentComplete">进度</param>
        /// <param name="oRestore">数据库还原服务对象</param>
        public bool SQLDbRestore(string filename, SqlConnectionStringBuilder connStrBuilder, SQLDMO.RestoreSink_PercentCompleteEventHandler Restore_PercentComplete, out SQLDMO.Restore oRestore)
        {
            string ServerIP      = connStrBuilder.DataSource;
            string LoginUserName = connStrBuilder.UserID;
            string LoginPass     = connStrBuilder.Password;
            string DBName        = connStrBuilder.InitialCatalog;

            oRestore = new SQLDMO.RestoreClass();
            SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
            try
            {
                oSQLServer.LoginSecure = false;
                oSQLServer.Connect(ServerIP, LoginUserName, LoginPass);
                //因为“数据库正在使用,所以无法获得对数据库的独占访问权。”不一定是由于其他进程的占用造成,还有其他的原因,所以要脱机再联机会比较保险...
                KillProcess(DBName);
                OffAndOnLine(DBName);
                oRestore.Action           = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
                oRestore.PercentComplete += Restore_PercentComplete;
                oRestore.Action           = SQLDMO.SQLDMO_RESTORE_TYPE.SQLDMORestore_Database;
                oRestore.Database         = DBName;
                oRestore.Files            = @"" + string.Format("[{0}]", filename) + "";
                oRestore.FileNumber       = 1;
                oRestore.ReplaceDatabase  = true;
                oRestore.SQLRestore(oSQLServer);
                return(true);
            }
            catch (Exception e)
            {
                MessageBox.Show("恢复时出错:" + e.Message);
            }
            finally
            {
                oSQLServer.DisConnect();
            }
            return(false);
        }