Beispiel #1
0
        /// <summary>
        /// 删除备份数据库
        /// </summary>
        /// <returns></returns>
        public bool DBDelete()
        {
            bool falg = true;

            try
            {
                if (!Open())
                {
                    return(false);
                }
                foreach (Database db in svr.Databases)
                {
                    if (db.Name != null && db.Name.ToLowerInvariant() == dbBackUpName)
                    {
                        #region 关闭sql连接
                        // 获取所有的进程列表
                        SQLDMO.QueryResults qr = svr.EnumProcesses(-1);

                        // 查找 SPID 和 DBName 的位置
                        int iColPIDNum = -1;        // 标记 SPID 的位置
                        int iColDbName = -1;        // 标记 DBName 的位置

                        for (int i = 1; i <= qr.Columns; i++)
                        {
                            string strName = qr.get_ColumnName(i);

                            if (strName.ToUpper().Trim() == "SPID")
                            {
                                // 标记 SPID
                                iColPIDNum = i;
                            }
                            else if (strName.ToUpper().Trim() == "DBNAME")
                            {
                                // 标记 DBName
                                iColDbName = i;
                            }

                            // 如果找到 SPID 和 DBName, 则跳出循环
                            if (iColPIDNum != -1 && iColDbName != -1)
                            {
                                break;
                            }
                        }

                        // 发现正在操作指定恢复的数据库的进程,将其强制终止
                        for (int i = 1; i <= qr.Rows; i++)
                        {
                            // 获取该进程正在操作的数据库名称
                            int    lPID      = qr.GetColumnLong(i, iColPIDNum);
                            string strDBName = qr.GetColumnString(i, iColDbName);

                            // 比对被操作的数据库是否是我们要还原的数据库
                            if (strDBName.ToUpper() == dbBackUpName.ToUpper())
                            {
                                svr.KillProcess(lPID);
                            }
                        }
                        #endregion

                        // 删除备数据库
                        svr.KillDatabase(dbBackUpName);

                        break;
                    }
                }
            }
            catch (System.Runtime.InteropServices.COMException ce)
            {
                if (ce.ErrorCode == -2147217803)
                {
                    // 分离错误 正在使用无法删除
                    ErrorMessage(202, ce.StackTrace, "[DBManage:DBDelete]", ce.Message);
                }
                falg = false;
            }
            //finally
            //{
            //    LinkNull(svr);
            //}
            return(falg);
        }
Beispiel #2
0
        public bool RestoreDB(string string_3, string string_4, string string_5, ProgressBar progressBar_1)
        {
            int  i;
            bool flag;

            this.progressBar_0 = progressBar_1;
            string    columnString   = "";
            string    str            = "";
            string    str1           = "";
            string    str2           = "";
            SQLServer sQLServerClass = new SQLServer();

            try
            {
                try
                {
                    sQLServerClass.Connect(this.ServerName, this.UserName, this.Password);
                    QueryResults queryResult = sQLServerClass.EnumProcesses(-1);
                    int          num         = -1;
                    int          num1        = -1;
                    for (i = 1; i <= queryResult.Columns; i++)
                    {
                        string columnName = queryResult.ColumnName[i];
                        if (columnName.ToUpper().Trim() == "SPID")
                        {
                            num = i;
                        }
                        else if (columnName.ToUpper().Trim() == "DBNAME")
                        {
                            num1 = i;
                        }
                        if ((num == -1 ? false : num1 != -1))
                        {
                            break;
                        }
                    }
                    for (i = 1; i <= queryResult.Rows; i++)
                    {
                        int columnLong = queryResult.GetColumnLong(i, num);
                        if (queryResult.GetColumnString(i, num1).ToUpper() == string_3.ToUpper())
                        {
                            sQLServerClass.KillProcess(columnLong);
                        }
                    }
                    Restore restoreClass = new Restore()
                    {
                        Action = SQLDMO_RESTORE_TYPE.SQLDMORestore_Database
                    };
                    restoreClass.PercentComplete += new RestoreSink_PercentCompleteEventHandler(this.Step);
                    restoreClass.Files            = string_4;
                    restoreClass.Database         = string_3;
                    restoreClass.RelocateFiles    = "[SuperOA],[D:\\aaaa.mdf]";
                    columnString = restoreClass.ReadFileList(sQLServerClass).GetColumnString(1, 1);
                    str          = restoreClass.ReadFileList(sQLServerClass).GetColumnString(2, 1);
                    str1         = string.Concat(string_5, columnString, ".mdf");
                    str2         = string.Concat(string_5, str, ".ldf");
                    string[] strArrays = new string[] { "[", columnString, "],[", str1, "],[", str, "],[", str2, "]" };
                    restoreClass.RelocateFiles   = string.Concat(strArrays);
                    restoreClass.ReplaceDatabase = true;
                    restoreClass.SQLRestore(sQLServerClass);
                    flag = true;
                }
                catch (Exception exception)
                {
                    exception.Message.ToString();
                    MessageBox.Show("恢复数据库失败,请关闭所有和该数据库连接的程序!");
                    flag = false;
                }
            }
            finally
            {
                sQLServerClass.DisConnect();
            }
            return(flag);
        }