Exemple #1
0
        public SqlServerBackup(string backupPath,Server server)
        {
            Restore restore=new Restore();
            restore.Devices.AddDevice(backupPath,DeviceType.File);
            DataTable dt= restore.ReadBackupHeader(server);

            if(dt.Rows.Count==1)
            {
                /*
               DataRow row = dt.Rows[0];
               BackupName = row[""].ToString();
               BackupDescription = row[""].ToString();
               Compressed = row[""].ToString();
               BackupTypeDescription = row[""].ToString();
               DifferentialBaseLSN = row[""].ToString();
               DifferentialBaseGUID = row[""].ToString();
               BackupSetGUID = row[""].ToString();
               ServerName = row[""].ToString();
               DatabaseName = row[""].ToString();
               DatabaseVersion = row[""].ToString();

               BackupStartDate = row[""].ToString();
               BackupFinishDate = row[""].ToString();
               MachineName = row[""].ToString();
               CompatibilityLevel = row[""].ToString();
               DatabaseVersion = row[""].ToString();
               DatabaseVersion = row[""].ToString();
               DatabaseVersion = row[""].ToString();
                 */
            }
        }
Exemple #2
0
        public static void MakeRestore(ServerMessageEventHandler onComplete, Guid id,
                                       string serverName, string dbName, string uncDir, string userName, string password)
        {
            var sc = new ServerConnection(serverName);

            sc.LoginSecure = false;
            sc.Login       = userName;
            sc.Password    = password;

            var srv  = new Server(sc);
            var rest = new Restore();

            rest.Action   = RestoreActionType.Database;
            rest.Database = dbName;
            rest.Devices.AddDevice(Path.Combine(uncDir, rest.Database + ".bak"), DeviceType.File);
            rest.ReplaceDatabase = true;

            var headers = rest.ReadBackupHeader(srv);
            var query   = from DataRow row in headers.Rows
                          where (string)row["BackupName"] == id.ToString()
                          select(Int16) row["Position"];

            rest.FileNumber = query.First();

            if (onComplete != null)
            {
                rest.Complete += onComplete;
            }
            rest.SqlRestore(srv);
        }
Exemple #3
0
        private void RestoreDatabaseLog(Server myServer)
        {
            Restore restoreDBLog = new Restore();

            restoreDBLog.Action = RestoreActionType.Log;
            restoreDBLog.Devices.AddDevice($"{bteFile.Text}", DeviceType.File);
            DataTable dataTable = restoreDBLog.ReadBackupHeader(myServer);

            if (dataTable.Rows.Count > 0)
            {
                restoreDBLog.Database = dataTable.Rows[0]["DatabaseName"].ToString();
            }

            /* You can specify NoRecovery = false (default) so that transactions are
             * rolled forward and recovered. */
            restoreDBLog.NoRecovery = true;

            /* Wiring up events for progress monitoring */
            restoreDBLog.PercentComplete += PercentComplete;
            restoreDBLog.Complete        += (sender, e) => Completed(sender, e, "Restore");

            /* SqlRestore method starts to restore database
             * You cab also use SqlRestoreAsync method to perform restore
             * operation asynchronously */
            restoreDBLog.SqlRestoreAsync(myServer);
        }
Exemple #4
0
        public static void MakeRestore(ServerMessageEventHandler onComplete, Guid id,
            string serverName, string dbName, string uncDir, string userName, string password)
        {
            var sc = new ServerConnection(serverName);
            sc.LoginSecure = false;
            sc.Login = userName;
            sc.Password = password;

            var srv = new Server(sc);
            var rest = new Restore();

            rest.Action = RestoreActionType.Database;
            rest.Database = dbName;
            rest.Devices.AddDevice(Path.Combine(uncDir, rest.Database + ".bak"), DeviceType.File);
            rest.ReplaceDatabase = true;

            var headers = rest.ReadBackupHeader(srv);
            var query = from DataRow row in headers.Rows
                        where (string)row["BackupName"] == id.ToString()
                        select (Int16)row["Position"];

            rest.FileNumber = query.First();

            if (onComplete != null) rest.Complete += onComplete;
            rest.SqlRestore(srv);
        }
Exemple #5
0
        public List <BackupItem> GetBackupItems(FileInfo file)
        {
            Check.DoRequireArgumentNotNull(file, "file");

            var restore = new Restore();

            restore.Devices.AddDevice(file.FullName, DeviceType.File);
            var headerTable = restore.ReadBackupHeader(Server);
            var result      = new List <BackupItem>(headerTable.Rows.Count);

            foreach (DataRow row in headerTable.Rows)
            {
                result.Add(GetBackupItem(row, file));
            }

            return(result);
        }
        public void RestoreDatabase(string fileName)
        {
            CreateDatabase();

            var restore = new Restore
            {
                Database        = _DatabaseName,
                Action          = RestoreActionType.Database,
                NoRecovery      = false,
                ReplaceDatabase = true
            };

            var path = Path.Combine(Directory.GetCurrentDirectory(), fileName);

            var device = new BackupDeviceItem(path, DeviceType.File);

            restore.Devices.Add(device);
            var backupHeader         = restore.ReadBackupHeader(_Server);
            var originalDatabaseName = backupHeader.Rows[0]["DatabaseName"].ToString();

            if (originalDatabaseName != _DatabaseName)
            {
                var dataFile = new RelocateFile
                {
                    PhysicalFileName = Path.Combine(_Server.DefaultFile, _DatabaseName + ".mdb"),
                    LogicalFileName  = originalDatabaseName
                };
                Console.WriteLine("Relocating {0} to {1}", dataFile.LogicalFileName, dataFile.PhysicalFileName);
                restore.RelocateFiles.Add(dataFile);

                var logFile = new RelocateFile
                {
                    PhysicalFileName = Path.Combine(_Server.DefaultLog, _DatabaseName + "_log.ldb"),
                    LogicalFileName  = originalDatabaseName + "_log"
                };
                Console.WriteLine("Relocating {0} to {1}", logFile.LogicalFileName, logFile.PhysicalFileName);
                restore.RelocateFiles.Add(logFile);
            }

            _Server.KillAllProcesses(_DatabaseName);
            restore.PercentCompleteNotification = 10;
            restore.PercentComplete            += (sender, e) => Console.WriteLine(e.Percent + "%");
            restore.SqlRestore(_Server);
        }
Exemple #7
0
        private void RestoreDatabaseWithDifferentNameAndLocation(Server myServer)
        {
            Restore restoreDB = new Restore();

            /* Specify whether you want to restore database or files or log etc */
            restoreDB.Action = RestoreActionType.Database;
            restoreDB.Devices.AddDevice($"{bteFile.Text}", DeviceType.File);
            DataTable dataTable = restoreDB.ReadBackupHeader(myServer);

            if (dataTable.Rows.Count > 0)
            {
                restoreDB.Database = dataTable.Rows[0]["DatabaseName"].ToString() + "New";
            }

            /* You can specify ReplaceDatabase = false (default) to not create a new image
             * of the database, the specified database must exist on SQL Server instance.
             * You can specify ReplaceDatabase = true to create new database image
             * regardless of the existence of specified database with same name */
            restoreDB.ReplaceDatabase = true;

            /* If you have differential or log restore to be followed, you would need
             * to specify NoRecovery = true, this will ensure no recovery is done after the
             * restore and subsequent restores are allowed. It means it will database
             * in the Restoring state. */
            restoreDB.NoRecovery = false;

            /* RelocateFiles collection allows you to specify the logical file names and
             * physical file names (new locations) if you want to restore to a different location.*/
            restoreDB.RelocateFiles.Add(new RelocateFile($"{ lokDB.Text}_Data", $@"{btePath.Text}\{ lokDB.Text}New_Data.mdf"));
            restoreDB.RelocateFiles.Add(new RelocateFile($"{ lokDB.Text}_Log", $@"{btePath.Text}\{ lokDB.Text}New_Log.ldf"));

            /* Wiring up events for progress monitoring */
            restoreDB.PercentComplete += PercentComplete;
            restoreDB.Complete        += (sender, e) => Completed(sender, e, "Restore");

            /* SqlRestore method starts to restore database
             * You cab also use SqlRestoreAsync method to perform restore
             * operation asynchronously */
            restoreDB.SqlRestoreAsync(myServer);
        }
        private void RestoreDatabaseWithDifferentNameAndLocation(Server myServer)
        {
            Restore restoreDB = new Restore();

            restoreDB.Action = RestoreActionType.Database;
            restoreDB.Devices.AddDevice($"{bteFile.Text}", DeviceType.File);
            DataTable dataTable = restoreDB.ReadBackupHeader(myServer);

            if (dataTable.Rows.Count > 0)
            {
                restoreDB.Database = dataTable.Rows[0]["DatabaseName"].ToString() + "New";
            }
            restoreDB.ReplaceDatabase = true;
            restoreDB.NoRecovery      = false;
            restoreDB.RelocateFiles.Add(new RelocateFile($"{ lokDatabase.Text}_Data", $@"{btePath.Text}\{ lokDatabase.Text}New_Data.mdf"));
            restoreDB.RelocateFiles.Add(new RelocateFile($"{ lokDatabase.Text}_Log", $@"{btePath.Text}\{ lokDatabase.Text}New_Log.ldf"));

            restoreDB.PercentComplete += PercentComplete;
            restoreDB.Complete        += (sender, e) => Completed(sender, e, "Restore");
            restoreDB.SqlRestoreAsync(myServer);
            restoreDB.Wait();
        }
Exemple #9
0
        /// <summary>
        /// Reads backup file header to get source database names
        /// If valid credential name is not provided for URL throws exception while executing T-sql statement
        /// </summary>
        /// <param name="bkdevList">List of backup device items</param>
        /// <param name="credential">Optional Sqlserver credential name to read backup header from URL</param>
        public List <String> GetSourceDbNames(ICollection <BackupDeviceItem> bkdevList, string credential = null)
        {
            List <string> databaseNames = new List <string>();

            foreach (BackupDeviceItem bkdev in bkdevList)
            {
                // use the Restore public API to do the Restore Headeronly query
                Restore res = new Restore();
                res.CredentialName = credential;
                res.Devices.Add(bkdev);

                DataTable dt = res.ReadBackupHeader(this.server);
                if (dt != null)
                {
                    foreach (DataRow dr in dt.Rows)
                    {
                        if (dr != null && !(dr["DatabaseName"] is DBNull))
                        {
                            string dbName = (string)dr["DatabaseName"];
                            bool   found  = false;
                            foreach (string str in databaseNames)
                            {
                                if (StringComparer.OrdinalIgnoreCase.Compare(str, dbName) == 0)
                                {
                                    found = true;
                                    break;
                                }
                            }
                            if (found == false)
                            {
                                databaseNames.Add(dbName);
                            }
                        }
                    }
                }
            }
            return(databaseNames);
        }
Exemple #10
0
        private void RestoreDatabaseDifferential(Server myServer)
        {
            Restore restoreDB = new Restore();

            restoreDB.Action = RestoreActionType.Database;
            restoreDB.Devices.AddDevice($"{bteFile.Text}", DeviceType.File);
            DataTable dataTable = restoreDB.ReadBackupHeader(myServer);

            if (dataTable.Rows.Count > 0)
            {
                restoreDB.Database = dataTable.Rows[0]["DatabaseName"].ToString();
            }

            Database db = myServer.Databases[restoreDB.Database];

            if (db != null)
            {
                db.DatabaseOptions.UserAccess = DatabaseUserAccess.Single;
                db.Alter(TerminationClause.RollbackTransactionsImmediately);
                db.Refresh();
            }

            restoreDB.ReplaceDatabase  = true;
            restoreDB.NoRecovery       = true;
            restoreDB.PercentComplete += PercentComplete;
            restoreDB.Complete        += (sender, e) => Completed(sender, e, "Restore");
            restoreDB.SqlRestoreAsync(myServer);
            restoreDB.Wait();

            if (db != null)
            {
                db.DatabaseOptions.UserAccess = DatabaseUserAccess.Multiple;
                db.Alter(TerminationClause.RollbackTransactionsImmediately);
                db.Refresh();
            }
        }
Exemple #11
0
        /// <summary>
        /// Used to restore databases older than 6.0
        /// </summary>
        /// <param name="fileContent"></param>
        /// <param name="serverAppFolder"></param>
        /// <returns></returns>
        //public static string RestoreDatabaseOld(string fileContent, string serverAppFolder)
        //{
        //    Trace.WriteLine(string.Format("IDEA.ERMT: {0}", "Start restore"));
        //    string fileName = serverAppFolder + "\\" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".bak.gz";
        //    Trace.WriteLine(string.Format("IDEA.ERMT: {0}", "Restore temp file: " + fileName));
        //    File.WriteAllBytes(fileName, Convert.FromBase64String(fileContent));
        //    // Get the stream of the source file.
        //    FileInfo fi = new FileInfo(fileName);
        //    using (FileStream inFile = fi.OpenRead())
        //    {
        //        // Get original file extension, for example "doc" from report.doc.gz.
        //        string curFile = fi.FullName;
        //        string origName = curFile.Remove(curFile.Length - fi.Extension.Length);

        //        //Create the decompressed file.
        //        using (FileStream outFile = File.Create(origName))
        //        {
        //            using (GZipStream decompress = new GZipStream(inFile,
        //                    CompressionMode.Decompress))
        //            {
        //                //Copy the decompression stream into the output file.
        //                byte[] buffer = new byte[4096];
        //                int numRead;
        //                while ((numRead = decompress.Read(buffer, 0, buffer.Length)) != 0)
        //                {
        //                    outFile.Write(buffer, 0, numRead);
        //                }
        //            }
        //        }

        //        Trace.WriteLine(string.Format("IDEA.ERMT: {0}", "Decompress finished."));

        //        Restore sqlRestore = new Restore();

        //        BackupDeviceItem deviceItem = new BackupDeviceItem(origName, DeviceType.File);

        //        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Idea"].ConnectionString);
        //        conn.Open();
        //        string databaseName = conn.Database;
        //        ServerConnection connection = new ServerConnection(conn);
        //        Server sqlServer = new Server(connection);
        //        sqlRestore.Devices.Add(deviceItem);
        //        sqlRestore.Database = conn.Database;
        //        DataTable dt = sqlRestore.ReadBackupHeader(sqlServer);

        //        //Check db is for the same app version
        //        //Check db is for the same app version
        //        if (dt.Rows[0]["BackupDescription"] == DBNull.Value ||
        //            ((string)dt.Rows[0]["BackupDescription"] != AppVersion.Version.ToString(2) &&
        //            //this awful hardcoded line is to allow backups from Version 5.5.6 in version 6
        //                !((string)dt.Rows[0]["BackupDescription"] == "5.5" && AppVersion.Version.Major == 6)))
        //        {
        //            //invalid db
        //            sqlRestore.Abort();
        //            string alter2 = @"ALTER DATABASE [" + databaseName + "] SET Multi_User";
        //            SqlCommand alter2Cmd = new SqlCommand(alter2, conn);
        //            alter2Cmd.ExecuteNonQuery();
        //            return string.Format("Backups from {0} version are not supported.", dt.Rows[0]["BackupDescription"] == System.DBNull.Value ? "an older" : (string)dt.Rows[0]["BackupDescription"]);
        //        }

        //        const string UseMaster = "USE master";
        //        SqlCommand useMasterCommand = new SqlCommand(UseMaster, conn);
        //        useMasterCommand.ExecuteNonQuery();

        //        string alter1 = @"ALTER DATABASE [" + databaseName + "] SET Single_User WITH Rollback Immediate";
        //        SqlCommand alter1Cmd = new SqlCommand(alter1, conn);
        //        alter1Cmd.ExecuteNonQuery();

        //        Database db = sqlServer.Databases[databaseName];
        //        sqlRestore.Action = RestoreActionType.Database;
        //        String dataFileLocation = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\DATABASE\\" + databaseName + ".mdf";
        //        String logFileLocation = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\DATABASE\\" + databaseName + "_Log.ldf";

        //        sqlRestore.RelocateFiles.Add(new RelocateFile("IDEA", dataFileLocation));
        //        sqlRestore.RelocateFiles.Add(new RelocateFile("IDEA" + "_log", logFileLocation));
        //        sqlRestore.ReplaceDatabase = true;
        //        sqlRestore.PercentCompleteNotification = 10;
        //        try
        //        {
        //            Trace.WriteLine(string.Format("IDEA.ERMT: {0}", "Restoring"));
        //            sqlRestore.SqlRestore(sqlServer);
        //            Trace.WriteLine(string.Format("IDEA.ERMT: {0}", "Finished restoring"));
        //        }
        //        catch (Exception ex)
        //        {
        //            return ex.Message;
        //        }
        //        finally
        //        {
        //            Trace.WriteLine(string.Format("IDEA.ERMT: {0}", "Executing SET Multi_User"));
        //            string alter2 = @"ALTER DATABASE [" + databaseName + "] SET Multi_User";
        //            SqlCommand alter2Cmd = new SqlCommand(alter2, conn);
        //            alter2Cmd.ExecuteNonQuery();
        //            Trace.WriteLine(string.Format("IDEA.ERMT: {0}", "SET Multi_User executed"));
        //        }

        //        db = sqlServer.Databases[databaseName];
        //        db.SetOnline();
        //        sqlServer.Refresh();

        //        try
        //        {
        //            if (conn.State != ConnectionState.Closed)
        //            {
        //                conn.Close();
        //            }
        //        }
        //        catch (Exception)
        //        {
        //        }

        //        try
        //        {
        //            Trace.WriteLine(string.Format("IDEA.ERMT: {0}", "Executing test SQL"));
        //            conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Idea"].ConnectionString);
        //            const string SQLQueryTest = @"SELECT * FROM FACTOR";
        //            SqlCommand sqlQueryTestCmd = new SqlCommand(SQLQueryTest, conn);
        //            conn.Open();
        //            sqlQueryTestCmd.ExecuteNonQuery();
        //            Trace.WriteLine(string.Format("IDEA.ERMT: {0}", "Test SQL executed."));

        //            const string SQLAutoCloseOff = @"ALTER DATABASE idea SET AUTO_CLOSE OFF";
        //            sqlQueryTestCmd = new SqlCommand(SQLAutoCloseOff, conn);
        //            sqlQueryTestCmd.ExecuteNonQuery();

        //            Trace.WriteLine(string.Format("IDEA.ERMT: {0}", "Auto_Close OFF executed."));

        //        }
        //        catch (Exception ex)
        //        {
        //            Trace.WriteLine(string.Format("IDEA.ERMT: {0}", "Failed executing test SQL"));
        //        }
        //        finally
        //        {
        //            if (conn.State != ConnectionState.Closed)
        //            {
        //                conn.Close();
        //                Trace.WriteLine(string.Format("IDEA.ERMT: {0}", "Connection closed"));
        //            }
        //        }
        //        return string.Empty;
        //    }
        //}

        /// <summary>
        /// Restore the Data Base of Idea
        /// </summary>
        /// <param name="databaseBackupFileName"></param>
        /// <returns></returns>
        private static string RestoreDatabase(string databaseBackupFileName)
        {
            Trace.WriteLine(string.Format("IDEA.ERMT: {0}", "Start restore"));

            Restore sqlRestore = new Restore();
            //  Restore - SqlDataBase;
            BackupDeviceItem deviceItem = new BackupDeviceItem(databaseBackupFileName, DeviceType.File);

            SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Idea"].ConnectionString);

            conn.Open();
            string           databaseName = conn.Database;
            ServerConnection connection   = new ServerConnection(conn);
            Server           sqlServer    = new Server(connection);

            sqlRestore.Devices.Add(deviceItem);
            sqlRestore.Database = conn.Database;

            DataTable dt = sqlRestore.ReadBackupHeader(sqlServer);

            //Check db is for the same app version
            if (dt.Rows[0]["BackupDescription"] == System.DBNull.Value || (dt.Rows[0]["BackupDescription"] != System.DBNull.Value && (string)dt.Rows[0]["BackupDescription"] != AppVersion.Version.ToString()))
            {
                //invalid db
                sqlRestore.Abort();
                string     alter2    = @"ALTER DATABASE [" + databaseName + "] SET Multi_User";
                SqlCommand alter2Cmd = new SqlCommand(alter2, conn);
                alter2Cmd.ExecuteNonQuery();
                return(string.Format("invaliddbversion"));
            }


            const string useMaster        = "USE master";
            SqlCommand   useMasterCommand = new SqlCommand(useMaster, conn);

            useMasterCommand.ExecuteNonQuery();

            string     alter1    = @"ALTER DATABASE [" + databaseName + "] SET Single_User WITH Rollback Immediate";
            SqlCommand alter1Cmd = new SqlCommand(alter1, conn);

            alter1Cmd.ExecuteNonQuery();

            Database db = sqlServer.Databases[databaseName];

            sqlRestore.Action = RestoreActionType.Database;
            String dataFileLocation = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\DATABASE\\" + databaseName + ".mdf";
            String logFileLocation  = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\DATABASE\\" + databaseName + "_Log.ldf";

            Trace.WriteLine(string.Format("IDEA.ERMT: dataFileLocation: {0}", dataFileLocation));
            Trace.WriteLine(string.Format("IDEA.ERMT: logFileLocation: {0}", logFileLocation));

            //sqlRestore.RelocateFiles.Add(new RelocateFile("IDEA", dataFileLocation));
            //sqlRestore.RelocateFiles.Add(new RelocateFile("IDEA_log", logFileLocation));
            sqlRestore.ReplaceDatabase             = true;
            sqlRestore.PercentCompleteNotification = 10;
            try
            {
                Trace.WriteLine(string.Format("IDEA.ERMT: {0}", "Restoring"));
                sqlRestore.SqlRestore(sqlServer);
                Trace.WriteLine(string.Format("IDEA.ERMT: {0}", "Restoring"));
            }
            catch (Exception ex)
            {
                Trace.WriteLine(string.Format("IDEA.ERMT: Exception restoring: {0}", ex.Message));
                return("errorrestoringdb");
            }
            finally
            {
                Trace.WriteLine(string.Format("IDEA.ERMT: {0}", "Executing SET Multi_User"));
                string     alter3    = @"ALTER DATABASE [" + databaseName + "] SET Multi_User";
                SqlCommand alter3Cmd = new SqlCommand(alter3, conn);
                alter3Cmd.ExecuteNonQuery();
                Trace.WriteLine(string.Format("IDEA.ERMT: {0}", "SET Multi_User executed"));
            }



            db = sqlServer.Databases[databaseName];
            db.SetOnline();
            sqlServer.Refresh();

            try
            {
                if (conn.State != ConnectionState.Closed)
                {
                    conn.Close();
                }
            }
            catch (Exception)
            {
            }

            try
            {
                Trace.WriteLine(string.Format("IDEA.ERMT: {0}", "Executing test SQL"));
                conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Idea"].ConnectionString);
                const string SQLQueryTest    = @"SELECT * FROM FACTOR";
                SqlCommand   sqlQueryTestCmd = new SqlCommand(SQLQueryTest, conn);
                conn.Open();
                sqlQueryTestCmd.ExecuteNonQuery();
                Trace.WriteLine(string.Format("IDEA.ERMT: {0}", "Test SQL executed."));

                const string SQLAutoCloseOff = @"ALTER DATABASE idea SET AUTO_CLOSE OFF";
                sqlQueryTestCmd = new SqlCommand(SQLAutoCloseOff, conn);
                sqlQueryTestCmd.ExecuteNonQuery();

                Trace.WriteLine(string.Format("IDEA.ERMT: {0}", "Auto_Close OFF executed."));
            }
            catch (Exception ex)
            {
                Trace.WriteLine(string.Format("IDEA.ERMT: {0}", "Failed executing test SQL"));
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                {
                    conn.Close();
                    Trace.WriteLine(string.Format("IDEA.ERMT: {0}", "Connection closed"));
                }
            }
            return(string.Empty);
        }
Exemple #12
0
        private void btnRestore_Click(object sender, EventArgs e)
        {
            try
            {
                if (String.IsNullOrEmpty(txtPath.Text))
                {
                    MessageBox.Show("No File Selected");
                    return;
                }
                else if (!File.Exists(txtPath.Text))
                {
                    MessageBox.Show("File Not Found");
                    return;
                }
                if (String.IsNullOrEmpty(txtDatabaseName.Text))
                {
                    MessageBox.Show("No Database Name Entered");
                    return;
                }
                string path = txtPath.Text;
                string name = txtDatabaseName.Text;

                Restore sqlRestore = new Restore {
                    Database = name
                };
                Server sqlServer = GetServer();

                if (sqlServer.Databases[name] != null)
                {
                    if (
                        MessageBox.Show("Delete existing database?", "Confirm Delete", MessageBoxButtons.YesNo,
                                        MessageBoxIcon.Warning) == DialogResult.Yes)
                    {
                        sqlServer.KillDatabase(name);
                    }
                    else
                    {
                        return;
                    }
                }

                Database db = new Database(sqlServer, name);
                db.Create();

                BackupDeviceItem backupDevice = new BackupDeviceItem(path, DeviceType.File);


                sqlRestore.Action = RestoreActionType.Database;
                sqlRestore.Devices.Add(backupDevice);

                var table = sqlRestore.ReadBackupHeader(sqlServer);

                var fileNumber = sqlRestore.FileNumber;
                foreach (DataRow r in table.Rows)
                {
                    var tempNum = -1;
                    if (!int.TryParse(r["Position"].ToString(), out tempNum))
                    {
                        continue;
                    }
                    if (tempNum > fileNumber)
                    {
                        fileNumber = tempNum;
                    }
                }
                sqlRestore.FileNumber = fileNumber;

                String dataFileLocation = db.FileGroups[0].Files[0].FileName;
                String logFileLocation  = db.LogFiles[0].FileName;
                db = sqlServer.Databases[name];
                sqlServer.ConnectionContext.Disconnect();

                RelocateFile rf = new RelocateFile(sqlRestore.ReadFileList(sqlServer).Rows[0]["LogicalName"].ToString(), dataFileLocation);
                RelocateFile lf = new RelocateFile(sqlRestore.ReadFileList(sqlServer).Rows[1]["LogicalName"].ToString(), logFileLocation);

                sqlRestore.RelocateFiles.Add(rf);
                sqlRestore.RelocateFiles.Add(lf);


                sqlRestore.ReplaceDatabase             = true;
                sqlRestore.PercentCompleteNotification = 1;
                sqlRestore.PercentComplete            += new PercentCompleteEventHandler(PercentCompleteHandler);
                //sqlRestore.Complete += new ServerMessageEventHandler(sqlRestore_Complete);

                sqlRestore.SqlRestore(sqlServer);

                db = sqlServer.Databases[name];
                db.SetOnline();
                sqlServer.Refresh();
                MessageBox.Show("Restore Completed");
                progressBar.Visible = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
Exemple #13
0
        /// <summary>
        /// Get the contents of the backup device.
        /// </summary>
        /// <param name="BackupDeviceName"></param>
        private void GetBackupDeviceContents(string BackupDeviceName)
        {
            Cursor           csr = null;
            DataTable        dataTable;
            ListViewItem     DeviceListViewItem;
            BackupDeviceItem backupDeviceItem;

            try
            {
                csr         = this.Cursor;        // Save the old cursor
                this.Cursor = Cursors.WaitCursor; // Display the waiting cursor

                // Create the restore object
                sqlRestore = new Restore();

                // Create a file backup device
                backupDeviceItem = new BackupDeviceItem(
                    BackupDeviceName, DeviceType.LogicalDevice);

                // Add the backup device to the restore object
                sqlRestore.Devices.Add(backupDeviceItem);

                // Get the backup header information
                dataTable = sqlRestore.ReadBackupHeader(SqlServerSelection);

                // Create the columns in the listview
                BackupContentsListView.Columns.Clear();
                foreach (DataColumn dtCol in dataTable.Columns)
                {
                    BackupContentsListView.Columns.Add(dtCol.ColumnName, 100,
                                                       HorizontalAlignment.Left);
                }

                // Populate the listview
                BackupContentsListView.Items.Clear();
                for (int rowCount = 0; rowCount < dataTable.Rows.Count; rowCount++)
                {
                    DeviceListViewItem = BackupContentsListView.Items.Add(
                        dataTable.Rows[rowCount][0].ToString());
                    for (int columnCount = 1; columnCount < dataTable.Columns.Count; columnCount++)
                    {
                        DeviceListViewItem.SubItems.Add(
                            dataTable.Rows[rowCount][columnCount].ToString());
                    }
                }

                // Select the first item in the list
                if (BackupContentsListView.Items.Count > 0)
                {
                    BackupContentsListView.Items[0].Selected = true;
                    BackupContentsListView.Items[0].EnsureVisible();
                }
            }
            catch (SmoException ex)
            {
                ExceptionMessageBox emb = new ExceptionMessageBox(ex);
                emb.Show(this);
            }
            catch (ExecutionFailureException ex)
            {
                ExceptionMessageBox emb = new ExceptionMessageBox(ex);
                emb.Show(this);
            }
            finally
            {
                this.Cursor = csr;  // Restore the original cursor
            }
        }
Exemple #14
0
        private void btnRestore_Click(object sender, EventArgs e)
        {
            try
            {
                if (String.IsNullOrEmpty(txtPath.Text))
                {
                    MessageBox.Show("No File Selected");
                    return;
                }
                else if (!File.Exists(txtPath.Text))
                {
                    MessageBox.Show("File Not Found");
                    return;
                }
                if (String.IsNullOrEmpty(txtDatabaseName.Text))
                {
                    MessageBox.Show("No Database Name Entered");
                    return;
                }
                string path = txtPath.Text;
                string name = txtDatabaseName.Text;

                Restore sqlRestore = new Restore { Database = name };
                Server sqlServer = GetServer();

                if (sqlServer.Databases[name] != null)
                {
                    if (
                        MessageBox.Show("Delete existing database?", "Confirm Delete", MessageBoxButtons.YesNo,
                                        MessageBoxIcon.Warning) == DialogResult.Yes)
                    {
                        sqlServer.KillDatabase(name);
                    }
                    else
                    {
                        return;
                    }
                }

                Database db = new Database(sqlServer, name);
                db.Create();

                BackupDeviceItem backupDevice = new BackupDeviceItem(path, DeviceType.File);

                sqlRestore.Action = RestoreActionType.Database;
                sqlRestore.Devices.Add(backupDevice);

                var table = sqlRestore.ReadBackupHeader(sqlServer);

                var fileNumber = sqlRestore.FileNumber;
                foreach (DataRow r in table.Rows)
                {
                    var tempNum = -1;
                    if (!int.TryParse(r["Position"].ToString(), out tempNum)) continue;
                    if (tempNum > fileNumber)
                    {
                        fileNumber = tempNum;
                    }
                }
                sqlRestore.FileNumber = fileNumber;

                String dataFileLocation = db.FileGroups[0].Files[0].FileName;
                String logFileLocation = db.LogFiles[0].FileName;
                db = sqlServer.Databases[name];
                sqlServer.ConnectionContext.Disconnect();

                RelocateFile rf = new RelocateFile(sqlRestore.ReadFileList(sqlServer).Rows[0]["LogicalName"].ToString(), dataFileLocation);
                RelocateFile lf = new RelocateFile(sqlRestore.ReadFileList(sqlServer).Rows[1]["LogicalName"].ToString(), logFileLocation);

                sqlRestore.RelocateFiles.Add(rf);
                sqlRestore.RelocateFiles.Add(lf);

                sqlRestore.ReplaceDatabase = true;
                sqlRestore.PercentCompleteNotification = 1;
                sqlRestore.PercentComplete += new PercentCompleteEventHandler(PercentCompleteHandler);
                //sqlRestore.Complete += new ServerMessageEventHandler(sqlRestore_Complete);

                sqlRestore.SqlRestore(sqlServer);

                db = sqlServer.Databases[name];
                db.SetOnline();
                sqlServer.Refresh();
                MessageBox.Show("Restore Completed");
                progressBar.Visible = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
Exemple #15
0
        /// <summary>
        /// Get the contents of the backup device.
        /// </summary>
        /// <param name="BackupDeviceName"></param>
        private void GetBackupDeviceContents(string BackupDeviceName)
        {
            Cursor csr = null;
            DataTable dataTable;
            ListViewItem DeviceListViewItem;
            BackupDeviceItem backupDeviceItem;

            try
            {
                csr = this.Cursor;   // Save the old cursor
                this.Cursor = Cursors.WaitCursor;   // Display the waiting cursor

                // Create the restore object
                sqlRestore = new Restore();

                // Create a file backup device
                backupDeviceItem = new BackupDeviceItem(
                    BackupDeviceName, DeviceType.LogicalDevice);

                // Add the backup device to the restore object
                sqlRestore.Devices.Add(backupDeviceItem);

                // Get the backup header information
                dataTable = sqlRestore.ReadBackupHeader(SqlServerSelection);

                // Create the columns in the listview
                BackupContentsListView.Columns.Clear();
                foreach (DataColumn dtCol in dataTable.Columns)
                {
                    BackupContentsListView.Columns.Add(dtCol.ColumnName, 100,
                        HorizontalAlignment.Left);
                }

                // Populate the listview
                BackupContentsListView.Items.Clear();
                for (int rowCount = 0; rowCount < dataTable.Rows.Count; rowCount++)
                {
                    DeviceListViewItem = BackupContentsListView.Items.Add(
                        dataTable.Rows[rowCount][0].ToString());
                    for (int columnCount = 1; columnCount < dataTable.Columns.Count; columnCount++)
                    {
                        DeviceListViewItem.SubItems.Add(
                            dataTable.Rows[rowCount][columnCount].ToString());
                    }
                }

                // Select the first item in the list
                if (BackupContentsListView.Items.Count > 0)
                {
                    BackupContentsListView.Items[0].Selected = true;
                    BackupContentsListView.Items[0].EnsureVisible();
                }
            }
            catch (SmoException ex)
            {
                ExceptionMessageBox emb = new ExceptionMessageBox(ex);
                emb.Show(this);
            }
            catch (ExecutionFailureException ex)
            {
                ExceptionMessageBox emb = new ExceptionMessageBox(ex);
                emb.Show(this);
            }
            finally
            {
                this.Cursor = csr;  // Restore the original cursor
            }
        }
        static void Main()
        {
            // For remote connection, remote server name / ServerInstance needs to be specified
            ServerConnection srvConn2 = new ServerConnection("machinename" /* <--default sql instance on machinename*/);     // or (@"machinename\sqlinstance") for named instances

            srvConn2.LoginSecure  = false;
            srvConn2.Login        = "******";
            srvConn2.Password     = "******";
            srvConn2.DatabaseName = "msdb";
            Server srv3 = new Server(srvConn2);

            //server info
            Console.WriteLine("servername:{0} ---- version:{1}", srv3.Name, srv3.Information.Version);

            //server root directory
            string serverRootDir = srv3.Information.RootDirectory;
            //server backup directory
            string serverBackupDir = srv3.Settings.BackupDirectory;
            //database primary directory
            string databasePrimaryFilepath = srv3.Databases[srvConn2.DatabaseName].PrimaryFilePath;

            Console.WriteLine("server_root_dir:{0}\nserver_backup_dir:{1}\ndatabase_primary_dir{2}", serverRootDir, serverBackupDir, databasePrimaryFilepath);

            Backup bkpDbFull = new Backup();

            bkpDbFull.Action = BackupActionType.Database;
            //comment out copyonly ....
            bkpDbFull.CopyOnly = true;     //copy only, just for testing....avoid messing up with existing backup processes
            bkpDbFull.Database = srvConn2.DatabaseName;

            //backup file name
            string backupfile = $"\\backuptest_{DateTime.Now.ToString("dd/MM/yyyy/hh/mm/ss")}.bak";

            //add multiple files, in each location
            bkpDbFull.Devices.AddDevice(serverRootDir + backupfile, DeviceType.File);
            bkpDbFull.Devices.AddDevice(serverBackupDir + backupfile, DeviceType.File);
            bkpDbFull.Devices.AddDevice(databasePrimaryFilepath + backupfile, DeviceType.File);
            bkpDbFull.Initialize = true;

            foreach (BackupDeviceItem backupdevice in bkpDbFull.Devices)
            {
                Console.WriteLine("deviceitem:{0}", backupdevice.Name);
            }

            //backup is split/divided amongst the 3 devices
            bkpDbFull.SqlBackup(srv3);

            Restore restore = new Restore();

            restore.Devices.AddRange(bkpDbFull.Devices);
            DataTable backupHeader = restore.ReadBackupHeader(srv3);


            //IsCopyOnly=True
            for (int r = 0; r < backupHeader.Rows.Count; r++)
            {
                for (int c = 0; c < backupHeader.Columns.Count; c++)
                {
                    Console.Write("{0}={1}\n", backupHeader.Columns[c].ColumnName, (string.IsNullOrEmpty(backupHeader.Rows[r].ItemArray[c].ToString())? "**": backupHeader.Rows[r].ItemArray[c].ToString()));
                }
            }

            srvConn2.Disconnect();     //redundant
        }