有没有把SqlServer Management Studio关了?

解决方案 »

  1.   

    恢复前要将正在使用此数据库的进程关闭``完整代码如下:
            public void RestoreDB(string FilePath)
            {
                if (BackUpData == true || RestoreData == true)//是否在进行数据备份或恢复
                    return;
                if (FilePath == "")//冗余
                    FilePath = System.Windows.Forms.Application.StartupPath + @"\BAK\系统.bak";
                else
                    FilePath = System.Windows.Forms.Application.StartupPath + FilePath;
                Thread TH = null;//子线程``跳过
                string strDbName = "系统";//数据库名
                string strFileName = FilePath;//冗余
                if (!File.Exists(strFileName))//检查备份文件
                {
                    if (FilePath == System.Windows.Forms.Application.StartupPath + @"\BAK\嘉源人事管理系统.bak")
                        MessageBox.Show("没有检测到备份文件,你可能还没有备份过");
                    else
                        MessageBox.Show("系统文件被删除或重命名,要解决此问题,请备份当前数据后重新安装本软件");
                    return;
                }            //以下为恢复代码            SQLDMO.SQLServer svr = new SQLDMO.SQLServerClass(); 
                Secret SC = new Secret();//加密类``不用管他
                string[] T_Data = File.ReadAllLines(".//System_Information//System_Information.ini", Encoding.UTF8);//读文件``跳过
                svr.Connect(SC.Fun_UnSecret(T_Data[2]), SC.Fun_UnSecret(T_Data[3]), SC.Fun_UnSecret(T_Data[4]));//连接user和pwd
                try
                {                
                    SQLDMO.QueryResults qr = svr.EnumProcesses(-1);
                    int iColPIDNum = -1;
                    int iColDbName = -1;
                    for (int i = 1; i <= qr.Columns; i++)
                    {
                        string strName = qr.get_ColumnName(i);
                        if (strName.ToUpper().Trim() == "SPID")
                        {
                            iColPIDNum = i;
                        }
                        else if (strName.ToUpper().Trim() == "DBNAME")
                        {
                            iColDbName = i;
                        }
                        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() == strDbName.ToUpper())
                        {
                            svr.KillProcess(lPID);
                        }
                    }                SQLDMO.Restore res = new SQLDMO.RestoreClass();
                    res.Action = 0;
                    res.Files = strFileName;
                    res.Database = strDbName;
                    res.ReplaceDatabase = true;
                    TH = new Thread(new ThreadStart(Wait_Form));//子线程``不用管他
                    TH.Start();//子线程
                    res.SQLRestore(svr);
                    TH.Abort();//子线程
                    RestoreData = false;//判断是否正在进行数据恢复
                    MessageBox.Show(@"已经成功恢复数据,系统将自动关闭,请重新启动");
                    System.Windows.Forms.Application.ExitThread();
                }
                catch
                {
                    TH.Abort();
                    MessageBox.Show(@"数据恢复失败");
                }
                finally
                {
                    svr.DisConnect();//关闭连接
                }
            }