گرفتن نسخه پشتیبان از پایگاه داده در ویندوز فرم (WindowsApp)

در این مقاله خواهیم آموخت که چگونه میتوانیم از پایگاه داده نسخه پشتیبان گرفته و و با استفاده از C# یک پروژه تحت ویندوز کاربرپسند طراحی کنیم. همانطور که میدانید در تمامی برنامه این عمل یک بخش بسیار مهم می باشد که باید انجام پذیرد.

گرفتن نسخه پشتیبان از پایگاه داده در ویندوز فرم (WindowsApp)

در این مقاله خواهیم آموخت  که چگونه میتوانیم از پایگاه داده نسخه پشتیبان گرفته و و با استفاده از C# یک پروژه تحت ویندوز کاربرپسند  طراحی کنیم.اغلب برای تهیه نسخه پشتیبان از پایگاه داده در SqlServer استفاده میکنیم.

SQL Server Management Objects (نام دیگر SMO) به ما اجازه میدهد که به اشیا Microsoft SQL Server دسترسی داشته باشیم.

SMO یک کتابخانه .NET است.تمام توابع قابل دسترس در SQL Server Management Studio در SMO هم قابل دسترس است اما SMO دارای ویژگی های بیشتری نسبت به Management Studio است.

مرحله 1

Visual Studio را اجرا کرده و یک پروژه تحت ویندوز ایجاد نموده و یک نام دلخواه برای ان انتخاب نمایید.

 

مرحله 2

فرمی همانند فرم زیر طراحی کنید.

همانند طرح  قبلی برنامه، وقتی ما برای اتصال به سرور(SERVER)  کلیک میکنیم ، پنجره ای برای اعتبارسنجی پایگاه داده SQL باز میشود.

دکمه دیگر "فراخوانی بانک اطلاعات" به ما اجازه فراخوانی اطلاعات وارد شده در پایگاه داده ونمایش آنها در لیست سمت راست را میدهد.

دکمه آخر برای انتخاب فضایی است که بعد از تهیه نسخه پشتیبان میخواهیم که فایل را در آنجا ذخیره کینم.

مرحله3

یک فرم ورود به سیستم همانند زیر طراحی کنید:

مرحله4

فراخوانی اسامی پایگاه داده های  درون سرور :

 

کد زیر جهت اتصال به SQL SERVER و فراخوانی پایگاه داده ها می باشد:


    serverName = textBox1.Text;    
    userName = textBox2.Text;    
    password = textBox3.Text;    
    string str = "Data Source=" + textBox1.Text + ";User ID=" + textBox2.Text + ";Password=" + textBox3.Text + "";    
    SqlConnection con = new SqlConnection(str);    
    try    
    {    
        con.Open();    
       // MessageBox.Show("connection gets established");    
        SqlCommand cmd = new SqlCommand("SELECT  db.[name] as dbname FROM [master].[sys].[databases] db", con);    
        SqlDataAdapter sda = new SqlDataAdapter(cmd);                
          
        sda.Fill(ds,"DatabaseName");    
        con.Close();    
        this.Close();     
    }    
    catch(Exception ex)    
    {    
        MessageBox.Show(ex.Message);    
    }  

مرحله5

یه فضا جهت ذخیره فایل نسخه پشتیبان انتخاب کنید :

بعد از انتخاب پوشه مقصد، ما نیاز به انتخاب یک پایگاه داده و یک پوشه مقصد برای عملیاتهای بیشترداریم.

ما برای تهیه نسخه پشتیبان از پایگاه داده نیاز به اضافه کردن رفرنس داریم و همچنین به 2 فضای نام مهم به ان باید اضافه کنیم


    using Microsoft.SqlServer.Management.Smo;  
    using Microsoft.SqlServer.Management.Common;  

زمانی که روی دکمه  شروع پشتیبان گیری کلیک میکنیم  کد زیر را برای نسخه پشتیبان مینویسیم:

      private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                if (DestPath == "" || DbName == "")
                {
                    MessageBox.Show("برای انتخاب پایگاه داده و پوشه مقصد تلاش کنید");
                }
                else
                {
                    string databaseName = DbName;//dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].FormattedValue.ToString();

                    //Define a Backup object variable.
                    Backup sqlBackup = new Backup();

                    ////Specify the type of backup, the description, the name, and the database to be backed up.
                    sqlBackup.Action = BackupActionType.Database;
                    sqlBackup.BackupSetDescription = "BackUp of:" + databaseName + "on" + DateTime.Now.ToShortDateString();
                    sqlBackup.BackupSetName = "FullBackUp";
                    sqlBackup.Database = databaseName;

                    ////Declare a BackupDeviceItem
                    string destinationPath = DestPath;
                    string backupfileName = DbName +".bak";
                    BackupDeviceItem deviceItem = new BackupDeviceItem(destinationPath + "\\" + backupfileName, DeviceType.File);
                    ////Define Server connection

                    //ServerConnection connection = new ServerConnection(frm.serverName, frm.userName, frm.password);
                    ServerConnection connection = new ServerConnection(Form1.serverName, Form1.userName, Form1.password);
                    ////To Avoid TimeOut Exception
                    Server sqlServer = new Server(connection);
                    sqlServer.ConnectionContext.StatementTimeout = 60 * 60;
                    Database db = sqlServer.Databases[databaseName];

                    sqlBackup.Initialize = true;
                    sqlBackup.Checksum = true;
                    sqlBackup.ContinueAfterError = true;

                    ////Add the device to the Backup object.
                    sqlBackup.Devices.Add(deviceItem);
                    ////Set the Incremental property to False to specify that this is a full database backup.
                    sqlBackup.Incremental = false;

                    sqlBackup.ExpirationDate = DateTime.Now.AddDays(3);
                    ////Specify that the log must be truncated after the backup is complete.
                    sqlBackup.LogTruncation = BackupTruncateLogType.Truncate;

                    sqlBackup.FormatMedia = false;
                    ////Run SqlBackup to perform the full database backup on the instance of SQL Server.
                    sqlBackup.SqlBackup(sqlServer);
                    ////Remove the backup device from the Backup object.
                    sqlBackup.Devices.Remove(deviceItem);
                    toolStripStatusLabel1.Text = "نسخه پشتیبان با موفقیت انجام شد";
                }
            }
            catch (Exception ex)
            {
                toolStripStatusLabel1.Text = ex.Message;
               // MessageBox.Show(ex.Message);
            }
        }

کد کامل فرم اصلی برنامه به شکل زیر خواهد شد:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
using System.IO;
namespace SqlDatabaseBackup
{
    public partial class MainFrm : Form
    {
        
         DataSet dsDatabse = new DataSet();
        public MainFrm()
        {
            InitializeComponent();
            
        }

        private void button2_Click(object sender, EventArgs e)
        {
           
            Form1 frm = new Form1();
            frm.Show();
            //dsDatabse= 
           // bindDatabase();

            //this.Close();
        }
        public void bindDatabase()
        {
            dsDatabse = Form1.ds;
             listBox1.Font = new Font("Arial", 11f);
            foreach (DataRow row in  dsDatabse.Tables[0].Rows)
            {
                ListViewItem item = new ListViewItem(row[0].ToString());
                for (int i = 1; i < dsDatabse.Tables[0].Columns.Count; i++)
                {
                    item.SubItems.Add(row[i].ToString());
                }
                //listBox1.Items.Add(item);
                listBox1.Items.Add(item.Text);
            }
        }       

        private void button1_Click(object sender, EventArgs e)
        {
           
            DialogResult result = folderBrowserDialog1.ShowDialog();
            listBox2.Font = new Font("Arial", 11f);
            try
            {
                if (result == DialogResult.OK)
                {
                    string[] files = Directory.GetDirectories(folderBrowserDialog1.SelectedPath);
                   // string[] files = Directory.GetFiles(folderBrowserDialog1.SelectedPath);
                    //listBox2.Items.Add(folderBrowserDialog1.SelectedPath);
                    listBox2.DataSource = files;

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        string DbName = string.Empty;
        private void listBox1_Click(object sender, EventArgs e)
        {
            DbName = listBox1.GetItemText(listBox1.SelectedItem);
            //MessageBox.Show(text);
        }
        string DestPath = string.Empty;
        private void listBox2_Click(object sender, EventArgs e)
        {
            DestPath = listBox2.GetItemText(listBox2.SelectedItem);
            //MessageBox.Show(text);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                if (DestPath == "" || DbName == "")
                {
                    MessageBox.Show("برای انتخاب پایگاه داده و پوشه مقصد تلاش کنید");
                }
                else
                {
                    string databaseName = DbName;//dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].FormattedValue.ToString();

                    //Define a Backup object variable.
                    Backup sqlBackup = new Backup();

                    ////Specify the type of backup, the description, the name, and the database to be backed up.
                    sqlBackup.Action = BackupActionType.Database;
                    sqlBackup.BackupSetDescription = "BackUp of:" + databaseName + "on" + DateTime.Now.ToShortDateString();
                    sqlBackup.BackupSetName = "FullBackUp";
                    sqlBackup.Database = databaseName;

                    ////Declare a BackupDeviceItem
                    string destinationPath = DestPath;
                    string backupfileName = DbName +".bak";
                    BackupDeviceItem deviceItem = new BackupDeviceItem(destinationPath + "\\" + backupfileName, DeviceType.File);
                    ////Define Server connection

                    //ServerConnection connection = new ServerConnection(frm.serverName, frm.userName, frm.password);
                    ServerConnection connection = new ServerConnection(Form1.serverName, Form1.userName, Form1.password);
                    ////To Avoid TimeOut Exception
                    Server sqlServer = new Server(connection);
                    sqlServer.ConnectionContext.StatementTimeout = 60 * 60;
                    Database db = sqlServer.Databases[databaseName];

                    sqlBackup.Initialize = true;
                    sqlBackup.Checksum = true;
                    sqlBackup.ContinueAfterError = true;

                    ////Add the device to the Backup object.
                    sqlBackup.Devices.Add(deviceItem);
                    ////Set the Incremental property to False to specify that this is a full database backup.
                    sqlBackup.Incremental = false;

                    sqlBackup.ExpirationDate = DateTime.Now.AddDays(3);
                    ////Specify that the log must be truncated after the backup is complete.
                    sqlBackup.LogTruncation = BackupTruncateLogType.Truncate;

                    sqlBackup.FormatMedia = false;
                    ////Run SqlBackup to perform the full database backup on the instance of SQL Server.
                    sqlBackup.SqlBackup(sqlServer);
                    ////Remove the backup device from the Backup object.
                    sqlBackup.Devices.Remove(deviceItem);
                    toolStripStatusLabel1.Text = "نسخه پشتیبان با موفقیت انجام شد";
                }
            }
            catch (Exception ex)
            {
                toolStripStatusLabel1.Text = ex.Message;
               // MessageBox.Show(ex.Message);
            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            bindDatabase();
        }

    }
}

در این مقاله اموختیم که چگونه میتوانیم از SMO استفاده کنیم تا به عملگرهای SQL در C# دسترسی داشته باشم.

ما میتوانیم از این فضاهای نام استفاده کرده و هر عملیاتی که خواستیم انجام دهیم.

فایل های ضمیمه