コード例 #1
0
        public static List <string> GetDatabases(string instanceName)
        {
            var    builder = new SqlConnectionStringBuilder(UtilityConfig.GetConnectionString(instanceName));
            Server srv     = new Server(new ServerConnection(builder.DataSource, builder.UserID, builder.Password));

            return(srv.Databases.Cast <Database>().Where(d => !d.IsSystemObject).Select(d => d.Name).ToList());
        }
コード例 #2
0
        public Response Task()
        {
            Response response    = new Response();
            string   dbBakFile   = _db.File.FullName;
            string   dbtoRestore = _db.DatabaseName;

            if (string.IsNullOrEmpty(dbBakFile) || !File.Exists(dbBakFile))
            {
                response.Status  = Response.ResponseMessage.Failed;
                response.Message = "No such .bak file found.";
                return(response);
            }

            var smoServer = _db.Server;

            var db = smoServer.Databases[dbtoRestore];

            if (db != null)
            {
                smoServer.KillAllProcesses(dbtoRestore);
                log.Debug("All processes on db killed");
                db.SetOffline();
            }

            string dataPath = UtilityConfig.GetMachineConfigValue("DataPath");
            string dbPath   = Path.Combine(dataPath, dbtoRestore + ".mdf");
            string logPath  = Path.Combine(dataPath, dbtoRestore + ".ldf");

            var restore    = new Restore();
            var deviceItem = new BackupDeviceItem(dbBakFile, DeviceType.File);

            restore.ReplaceDatabase             = true;
            restore.PercentCompleteNotification = 10;
            restore.PercentComplete            += restore_PercentComplete;
            restore.Complete += restore_Complete;

            try
            {
                restore.Devices.Add(deviceItem);
                if (db != null)
                {
                    DataTable dtFileList     = restore.ReadFileList(smoServer);
                    string    dbLogicalName  = dtFileList.Rows[0][0].ToString();
                    string    logLogicalName = dtFileList.Rows[1][0].ToString();
                    restore.RelocateFiles.Add(new RelocateFile(dbLogicalName, dbPath));
                    restore.RelocateFiles.Add(new RelocateFile(logLogicalName, logPath));
                }
                else
                {
                    Database  smoDatabase = new Database(smoServer, dbtoRestore);
                    FileGroup fg          = new FileGroup(smoDatabase, "PRIMARY");
                    smoDatabase.FileGroups.Add(fg);
                    DataFile df = new DataFile(fg, dbtoRestore, dbPath);
                    df.IsPrimaryFile = true;
                    fg.Files.Add(df);

                    LogFile lf = new LogFile(smoDatabase, dbtoRestore + "_log", logPath);
                    smoDatabase.LogFiles.Add(lf);
                    smoDatabase.Create();
                    smoServer.Refresh();
                    smoServer.KillAllProcesses(dbtoRestore);
                    log.Debug("All processes on db killed");
                    smoServer.Databases[dbtoRestore].SetOffline();
                    //restore.DatabaseFiles.Add(dbPath);
                    //restore.DatabaseFiles.Add(logPath);
                    DataTable dtFileList     = restore.ReadFileList(smoServer);
                    string    dbLogicalName  = dtFileList.Rows[0][0].ToString();
                    string    logLogicalName = dtFileList.Rows[1][0].ToString();
                    restore.RelocateFiles.Add(new RelocateFile(dbLogicalName, dbPath));
                    restore.RelocateFiles.Add(new RelocateFile(logLogicalName, logPath));
                }
                restore.Database   = dbtoRestore;
                restore.FileNumber = 1;
                restore.Action     = RestoreActionType.Files;
                restore.SqlRestore(smoServer);
                db = smoServer.Databases[dbtoRestore];
                db.SetOnline();
                smoServer.Refresh();
                db.Refresh();
            }
            catch (Exception ex)
            {
                // cleanup
                smoServer.Refresh();
                db = smoServer.Databases[dbtoRestore];

                if (db != null)
                {
                    db.Drop();
                }
                if (File.Exists(dbPath))
                {
                    File.Delete(dbPath);
                }
                if (File.Exists(logPath))
                {
                    File.Delete(dbPath);
                }

                response.Status  = Response.ResponseMessage.Failed;
                response.Message = ex.GetExceptionMessages();
                return(response);
            }

            response.Status  = Response.ResponseMessage.Succeeded;
            response.Message = string.Format("{0} file restored to database {1}.", _db.File.Name, dbtoRestore);
            return(response);
        }