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()); }
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); }