Neben den auf einem SQL-Server implementierten regelmäßigen Voll- und Log-Sicherungen ist es oft ganz praktisch manuell eine Sicherung durchführen zu können. Dabei sollen mehrere Datenbanken hintereinander weg mit nur wenigen Klicks gesichert werden. Dieser Tipp zeigt, wie die auf einem MS SQL-Server vorhandenen Datenbanken angezeigt, zur Sicherung benutzerdefiniert ausgewählt und anschließend gesichert werden. Erstellen Sie ein neues Windows-Forms Projekt und platzieren auf die Form folgende Controls:
Und hier der Code der Form: Imports System.IO Imports System.Data Imports System.Data.SqlClient Public Class Form1 ' ----------------------------- Einstellungen ----------------------- ' Damit man bei der Sicherung von größeren Datenbanken in keinen ' Timeout läuft, hier: 300 = 300 Sekunden Private ConnStr As String = "Data Source=.\;" & _ "Initial Catalog=Master;" & _ "Integrated Security=True;" & _ "Connection Timeout=300" ' Verzeichnis auf dem SQL-Server in dem die Sicherung abgelegt wird: Private FilePath4BackupDatabase_AusSichtDesServers As String = "" ' ------------------------------------------------------------------- ' ListBox1 enthält alle auf dem Server verfügbaren Datenbanken. ' ListBox1 wird hier gefüllt: Private dv As DataView Private Sub FillListBox1() Try ListBox1.DataSource = Nothing Dim conn As New SqlConnection conn.ConnectionString = ConnStr Dim cmd As New SqlCommand cmd.Connection = conn conn.Open() Dim da As New SqlDataAdapter( _ "select Name from sys.databases order by Name", conn) Dim dt As New DataTable da.Fill(dt) dv = New DataView(dt) ListBox1.DataSource = dv ListBox1.ValueMember = "Name" ListBox1.DisplayMember = "Name" conn.Close() Catch ex As Exception End Try End Sub ' Nach Auswahl eines Eintrages aus ListBox1 wird mit einem ' Klick auf den btnAdd dieser Eintrag zur ListBox2 hinzugefügt. ' Alle in ListBox2 aufgeführten Datenbanken sollen im weiteren ' Verlauf gesichert werden. Private Sub btnAdd_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnAdd.Click btnAddAll.Enabled = False Try Dim Item_ As String = dv(ListBox1.SelectedIndex).Row("Name").ToString If Not ListBox2.Items.Contains(Item_) Then ListBox2.Items.Add(Item_) End If dv(ListBox1.SelectedIndex).Delete() Catch ex As Exception End Try btnAddAll.Enabled = (ListBox1.Items.Count > 0) btnReset.Enabled = (ListBox2.Items.Count > 0) btnSave.Enabled = (txtFolder.TextLength > 0 AndAlso _ ListBox2.Items.Count > 0) End Sub ' Durch Klick auf den Button btnAddAll werden alle in der ' ListBox1 aufgeführten Datenbanken in die ListBox2 hinzugefügt. Private Sub btnAddAlle_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnAddAll.Click btnAdd.Enabled = False Try Dim CountItems As Integer = ListBox1.Items.Count For i As Integer = 0 To CountItems - 1 ListBox1.SelectedIndex = 0 Dim Item_ As String = dv(ListBox1.SelectedIndex).Row("Name").ToString ListBox2.Items.Add(Item_) dv(ListBox1.SelectedIndex).Delete() Next Catch ex As Exception End Try btnAddAll.Enabled = (ListBox1.Items.Count > 0) btnReset.Enabled = (ListBox2.Items.Count > 0) btnSave.Enabled = (txtFolder.TextLength > 0 AndAlso _ ListBox2.Items.Count > 0) End Sub ' Der btnReset macht die bisherigen Auswahleinstellungen rückgängig, ' d. h. entfernt die bisher für die Sicherung ausgewählten ' Datenbanken aus ListBox2 und stellt den urspr. Zustand auch in ' ListBox1 wieder her: Private Sub btnReset_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnReset.Click FillListBox1() ListBox2.Items.Clear() btnAdd.Enabled = ListBox1.SelectedIndex >= 0 btnAddAll.Enabled = ListBox1.Items.Count > 0 btnReset.Enabled = False btnSave.Enabled = (txtFolder.TextLength > 0 AndAlso _ ListBox2.Items.Count > 0) End Sub ' Durch Klick auf den btnSave wird die Sicherung gestartet: Private Sub btnSave_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnSave.Click Backup() End Sub Private Sub Backup() ' Damit man keinen Background-Worker einbauen muss, kann man ' auch einfach die Form für die Zeit der Durchführung ' der Sicherung minimieren: Me.WindowState = FormWindowState.Minimized If ListBox2.Items.Count > 0 Then Backup_Databases() End If Me.WindowState = FormWindowState.Normal End Sub Private Sub Backup_Databases() ' Für jeden Eintrag (Datenbank) in ListBox2 wird nun ' die Sicherung durchgeführt: Dim i As Integer = ListBox2.Items.Count For i_ As Integer = 0 To i - 1 ListBox2.SelectedIndex = i_ Try ' Sicherung der Datenbank durchführen: Dim conn As New SqlConnection conn.ConnectionString = ConnStr Dim cmd As New SqlCommand cmd.Connection = conn cmd.CommandText = "use Master; backup database " & _ ListBox2.SelectedItem.ToString.Trim & _ " to Disk = '" & _ FilePath4BackupDatabase_AusSichtDesServers & _ "\" & ListBox2.SelectedItem.ToString.Trim & _ ".bak' with init;" cmd.CommandType = CommandType.Text conn.Open() cmd.ExecuteNonQuery() conn.Close() Catch ex As Exception Me.WindowState = FormWindowState.Normal MessageBox.Show(ex.Message.ToString, "Fehler", _ MessageBoxButtons.OK, MessageBoxIcon.Error) End Try Next End Sub Private Sub Form1_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load ' ListBox1 mit den verfügbaren Datenbanken füllen. ' Durch Auswahl der Buttons btnAdd bzw. btnAddAll, können ' zur ListBox2 aus der ListBox1 die Datenbanken hinzugefügt ' werden, die im weiteren Verlauf gesichert werden sollen: FillListBox1() txtFolder.Text = "D:\Backup" End Sub Private Sub txtFolder_TextChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles txtFolder.TextChanged ' Prüfen btnSave.Enabled = (txtFolder.TextLength > 0 AndAlso _ ListBox2.Items.Count > 0) End Sub Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged btnAdd.Enabled = (ListBox1.SelectedIndex >= 0) btnAddAll.Enabled = (ListBox1.Items.Count > 0) End Sub Private Sub ListBox2_SelectedIndexChanged(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles ListBox2.SelectedIndexChanged btnReset.Enabled = (ListBox2.Items.Count > 0) End Sub End Class |