2013-04-06 18 views
5

SQL Server kopii zapasowej i przywracania kopii zapasowych

string connectionString1 = (@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|Database1.mdf;Database=Database1;Integrated Security=True; User Instance=True"); 
      SqlConnection cn = new SqlConnection(connectionString1); 
      cn.Open(); 
      SqlCommand cmd = new SqlCommand(); 
      SqlDataReader reader; 
      cmd.CommandText = @"BACKUP DATABASE Database1 TO DISK = 'C:\SRI2Works.bak'"; 

      cmd.CommandType = CommandType.Text; 
      cmd.Connection = cn; 
      reader = cmd.ExecuteReader(); 
      cn.Close(); 
      MessageBox.Show("Database Backup Successfull."); 

przywrócić

string connectionString1 = (@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|Database1.mdf;Database=Database1;Integrated Security=True; User Instance=True"); 
      SqlConnection cn = new SqlConnection(connectionString1); 
      cn.Open(); 

      SqlCommand cmd = new SqlCommand(); 
      SqlDataReader reader; 
      cmd.CommandText = @"use master; RESTORE DATABASE Database1 FROM DISK = 'C:\SRI2Works.bak'"; 
      cmd.CommandText = "DBCC CHECKDB ('Database1')"; 
      cmd.CommandType = CommandType.Text; 
      cmd.Connection = cn; 
      reader = cmd.ExecuteReader(); 
      cn.Close(); 
      MessageBox.Show("Database Restored Successfull."); 

Kod ten przebiega pomyślnie, ale nie wprowadzać żadnych zmian.

+0

W jaki sposób zweryfikowałeś, że kod został rzeczywiście wykonany? Czy okno wiadomości się rozpaliło? – usr

+0

Czy faktycznie zapisano plik 'C: \ SRI2Works.bak'? I tak jak jest, twoje polecenie przywracania wykonuje tylko 'DBCC CHECKDB ('Database1')', który zastępuje 'CommandText' ustawiony w powyższym wierszu. –

+0

@ ThomasGerstendörfer dobry połów! OP powinien użyć programu SQL Profiler, aby sprawdzić, czy oczekiwane polecenia są rzeczywiście wysyłane. – usr

Odpowiedz

0

Na przykład mamy 2 paski menu; jeden do tworzenia kopii zapasowych, a drugi do przywracania, więc wykonują swoje metody! Spróbuj tego:

private void saveDatabaseToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      BackupDatabase(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message + " \nPlease choose the folder Sauvegardes to backup !"); 
     } 

    } 
    private void restoreDatabaseToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      RestoreDatabase(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
    private void BackupDatabase() 
    { 
     saveFileDialogBackUp.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory + @"Sauvegardes"; 
     if (saveFileDialogBackUp.ShowDialog() == DialogResult.OK) 
     { 
      Con.ExecuteCmd("BACKUP DATABASE MyFooDatabase TO DISK = '" + saveFileDialogBackUp.FileName + "'"); 
      MessageBox.Show("Success , done!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); 
     } 
    } 
    private void RestoreDatabase() 
    { 
     openFileDialogBackUp.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory + @"Sauvegardes"; 
     if (openFileDialogBackUp.ShowDialog() == DialogResult.OK) 
     { 
      Con.ExecuteCmd(" USE MASTER RESTORE DATABASE MyFooDatabase FROM DISK = '"+openFileDialogBackUp.FileName+"' WITH REPLACE"); 
      MessageBox.Show("Database Restored", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); 
     } 

    } 
0

Usuń następujące oświadczenie z kodu:

cmd.CommandText = "DBCC CHECKDB ('Database1')"; 

a jeśli chcesz nadpisać istniejące bazy danych należy użyć następującego polecenia dla CommandText:

cmd.CommandText = @"use master; RESTORE DATABASE Database1 FROM DISK = 'C:\SRI2Works.bak' WITH REPLACE"; 
6

spróbuj tego Kod w przywracanie bazy danych:

private void restoreButton_Click(object sender, EventArgs e) 
    { 
    string database = con.Database.ToString(); 
    if (con.State != ConnectionState.Open) 
    { 
     con.Open(); 
    } 
    try 
    { 
     string sqlStmt2 = string.Format("ALTER DATABASE [" + database + "] SET SINGLE_USER WITH ROLLBACK IMMEDIATE"); 
     SqlCommand bu2 = new SqlCommand(sqlStmt2, con); 
     bu2.ExecuteNonQuery(); 

     string sqlStmt3 = "USE MASTER RESTORE DATABASE [" + database + "] FROM DISK='" + textBox2.Text + "'WITH REPLACE;"; 
     SqlCommand bu3 = new SqlCommand(sqlStmt3, con); 
     bu3.ExecuteNonQuery(); 

     string sqlStmt4 = string.Format("ALTER DATABASE [" + database + "] SET MULTI_USER"); 
     SqlCommand bu4 = new SqlCommand(sqlStmt4, con); 
     bu4.ExecuteNonQuery(); 

     MessageBox.Show("database restoration done successefully"); 
     con.Close(); 

    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 
} 

Dalsze wyjaśnienia sprawdź ten poradnik: Backup & Restore Sql Server database using C#

+0

To było niesamowite. Uratowałem mój czas. i +1 dla linku referencyjnego również :) – Mehmood

0
RESTORE DATABASE [C] FROM DISK = 'D:\\Inventory.bak' WITH RECOVERY, 
MOVE 'Inventory_Data' 
TO 'C:\\Program Files\\Microsoft SQL Server\\MSSQL\\Data\\c_Data.MDF', 
MOVE 'Inventory_Log' 
TO 
'C:\\Program Files\\Microsoft SQL Server\\MSSQL\\Data\\c_Log.LDF', 
REPLACE, stats =1 

Jedyną rzeczą, którą musisz się martwić o, przywracanie bazy danych nie jest tworzony w MS SQL Server. W moim przypadku po uruchomieniu zapytania powinien utworzyć nową bazę danych o nazwie [C] i utworzyć jej plik na ścieżce [C:\\Program Files\\Microsoft SQL Server\\MSSQL\\Data\\]

Powiązane problemy