# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > دسترسی به داده ها (ADO.Net و LINQ و ...) >  backup , Restore database

## ammarkarimi

سلام این کد های بک آپ و رستور برنامه منه هر دوش اررور میده. 
کمککککککککککککککککککککککک  ککک


واسه بک آپ :

private void btn_backup_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection(@"data source=.; initial catalog=dabirkhane; integrated security=true");
            SqlCommand com = new SqlCommand("backup Database dabirkhane to disk='" + txt_path_backup.Text + "'", con);
            con.Open();
            int result = com.ExecuteNonQuery();
            if (result > 0)
                MessageBox.Show("backup compelete.");
            con.Close();
        }

واسه رستور :

 private void btn_restore_Click(object sender, EventArgs e)
        {
            SqlConnection con = new SqlConnection(@"data source=.; initial catalog=dabirkhane; integrated security=true");
            SqlCommand com = new SqlCommand("Restore Database dabirkhane From disk ='"+txt_path_restore.Text+"'"+"With File=1,Norecovery'" , con);
            con.Open();
            int result = com.ExecuteNonQuery();
            if (result > 0)
                MessageBox.Show("Restore compelete.");
            con.Close();               
        }

----------


## Blackk_lightt

سلام
چه اروری میده ؟
بگو شاید بتونم کمکت کنم

----------


## ammarkarimi

از این خط می گیره
int result = com.ExecuteNonQuery();


کلا چه جوری میشه نوشت؟کسی بلد نیست راهنمایی کنه.
خواهشا کسی نگه سرچ کن که این ها رو از سرچ در آوردم)

----------


## ammarkarimi

اصلا کد بالا را بی خیال !
شما کد بکآپ و رستور رو ندارید.

----------


## pars.engineer

> از این خط می گیره
> 
> int result = com.ExecuteNonQuery();


خوب اين كه معلومه كه از اين خط خطا مي گيرد. اينكه چه خطايي مي گيرد مهم است.
به هر حال براي backUp كد زير را استفاده كنيد.


 
objCommand = 
newSqlCommand("BACKUP DATABASE YourDataBase TO DISK = N'" + txtDataFileName.Text + "'" + 
" WITH NOFORMAT, NOINIT, NAME = N'mydb-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10", objConnection);

objConnection.Open();
intSuccessRecovery = objCommand.ExecuteNonQuery();
objConnection.Close();
 
 


روش Restore هم در لينك زير كاملا توضيح داده ام.

https://barnamenevis.org/showthread.php?t=118712

موفق باشيد.

----------


## bachebahal_1363

اگر خوب جستجو می کردی یه چیزای بهتری پیدا می کردی . 
من در تاپیک زیر یک برنامه قرار دادم که با استفاده از SqlDmo می تونی به راحتی BackUpو Restore کنی :
نمایش تاپیک

دانلود مستقیم برنامه

----------


## ammarkarimi

کد بکاپ رو به صورت زیر تغییر دادم 
private void btn_backup_Click(object sender, EventArgs e)
        {
            SqlConnection objConnection = new SqlConnection("server=.; database=db_test; integrated security=true");
            SqlCommand objCommand =new SqlCommand("BACKUP DATABASE db_test TO DISK ='c:\\b.bak' WITH NOFORMAT, NOINIT, NAME = N'mydb-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10", objConnection);
            objConnection.Open();
            int Successbackup = objCommand.ExecuteNonQuery();
            if (Successbackup > 0)
                MessageBox.Show("backup compelete.");
            objConnection.Close();
        }
ولی مسیج باکس کامپلت اجرا نمی شه.(بعد از زدن دکمه backup)
وبا هر بار زدن دکمه backup  ، دو مگ به حجم فایل بکاپ اضافه می شه .چه کار کنم؟؟؟؟؟؟؟؟؟؟؟

----------


## ammarkarimi

WITH NOFORMAT, NOINIT, NAME = N'mydb-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
میشه بگید هر کدوم از این پارامتر ها چکار می کنه؟
فکر کنم یکیش برای ریپلیس رو بانک قبلی باشه.

----------


## pars.engineer

> میشه بگید هر کدوم از این پارامتر ها چکار می کنه؟




استفاده از اين پارامترها ضروري نيست و اغلب زماني كاربرد دارند كه بخواهيم فايل پشتيبان را بر روي نوار ذخيره كنيم.
به عنوان مثال NoUnload مشخص مي كند كه نوار پس از خاتمه پشتبان، خارج نشود و يا NoRewind مشخص مي كند كه نوار پس از خاتمه پشتيبان گيري به عقب بر گردانده نشود.
Stats  فواصل زماني اطلاع رساني پيشرفت كار را مشخص مي كند و وقتي برابر 10 است بدين معناست كه پس از انجام 10 درصد از عمليات پشتيبان گيري SQL پيام مناسب را بر گرداند.

در مورد مشكل شما نيز چون NOINIT ست شده است، پس از هر بار پشتيبان گيري اطلاعات جديد به ادامه فايل قبلي اضافه مي شود و اگر آن را به INIT تغيير دهيد، هر بار اطلاعات قبلي از بين خواهد رفت.

در مورد MessageBox  هم، بايد بدانيد كه تابع ExecuteNonQuery  تعداد سطر هايي را مورد اثر قرار گرفته اند، بر مي گرداند، و در هنگام اجراي دستور BackUp معمولا يك عدد منفي بر گردانده خواهد شد.(اغلب اوقات -1)  پس كدتان را به صورت زير تغيير دهيد.


if (Successbackup != 0)
                MessageBox.Show("backup compelete."); 
موفق باشيد

----------


## ammarkarimi

آقا دمت گرم.درست شد.
ولی با رستور مشکل دارم

کد رستور :
SqlConnection SqlCon = new SqlConnection("server=.; database=dabirkhane; integrated security=true");
                SqlCommand SqlCom = new SqlCommand();
                SqlCon.Open();
                SqlCom.CommandText =
                "ALTER DATABASE dabirkhane SET SINGLE_USER WITH ROLLBACK IMMEDIATE" +
                " USE master; RESTORE DATABASE dabirkhane FROM DISK ='" + txt_path_restore.Text + "'";
                SqlCom.Connection = SqlCon;
                SqlCom.ExecuteNonQuery();
                SqlCon.Close();
                
                //*******************

                SqlCon.Open();
                SqlCom.CommandText =
                "ALTER DATABASE dabirkhane SET MULTI_USER ";
                SqlCom.Connection = SqlCon;
                SqlCom.ExecuteNonQuery();
                SqlCon.Close();
                MessageBox.Show("بازگردانی اطلاعات با موفقیت انجام شد");

کد رستور این خطا رو می ده :



> The tail of the log for the database "dabirkhane" has not been backed up. Use BACKUP LOG WITH NORECOVERY to backup the log if it contains work you do not want to lose. Use the WITH REPLACE or WITH STOPAT clause of the RESTORE statement to just overwrite the contents of the log.
> RESTORE DATABASE is terminating abnormally.

----------


## bachebahal_1363

آقا می شه بگی دم کی گرم؟
از کد کی استفاده کردی که درست شد ، که حالا برای restore به مشکل بر خورد کردی ؟

----------


## ammarkarimi

از کد pars.engineer
البته برنامه شما رو هم دیدم.(ولی هنگ کردم خوب نوشته شده بود(عالی) ولی من تو بانک تازه کارم)
از شمام سپاسگزارم

----------


## ammarkarimi

حالا می تونی بگی مشکل من (تو پست 11) چیه؟

----------


## mohammady2

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace DataBR
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            //پشتیبان گیری از بانک اطلاعاتی
            SqlConnection con = new SqlConnection();
            con.ConnectionString = "Data Source=(local)\\SQLEXPRESS;database=aaa;Integrated Security=SSPI";
            SqlCommand cmd = new SqlCommand();
            try
            {
                con.Open();
                //BACKUP DATABASE نام بانک اطلاعاتی TO DISK = 'مسیر پشتیبان گیری بانک اطلاعاتی'
                string query = "BACKUP DATABASE aaa TO DISK = 'C:\\database\\aaabackup.MDF'";
                cmd.CommandText = query;
                cmd.Connection = con;
                cmd.ExecuteNonQuery();
                con.Close();
                MessageBox.Show("پشتیبان گیری به درستی انجام شد");
            }
            catch
            {
                MessageBox.Show("اشکال در ارتباط با بانک اطلاعاتی");
            }
 
        }
        private void button2_Click(object sender, EventArgs e)
        {
            //بازیابی بانک اطلاعاتی
            SqlConnection con = new SqlConnection();
            con.ConnectionString = "Data Source=(local)\\SQLEXPRESS;database=aaa;Integrated Security=SSPI";
            SqlCommand cmd = new SqlCommand();
            try
            {
                con.Open();
                //USE master RESTORE DATABASE [نام بانک اطلاعاتی] FROM DISK = 'مسیر فایل بانک اطلاعاتی'
                string query = "USE master RESTORE DATABASE [aaa] FROM DISK = 'C:\\DataBase\\aaabackup.MDF'";
                cmd.CommandText = query;
                cmd.Connection = con;
                cmd.ExecuteNonQuery();
                con.Close();
                MessageBox.Show("بازیابی به درستی انجام شد");
            }
            catch
            {
                MessageBox.Show("اشکال در ارتباط با بانک اطلاعاتی");
            }
        }
    }
}

----------


## ammarkarimi

mohammady2 جان.کد شما رو آزمایش کردم.رستورش اررور زیر رو می ده :



> Exclusive access could not be obtained because the database is in use.
> RESTORE DATABASE is terminating abnormally.
> Changed database context to 'master'.

----------


## mohammady2

ببین عزیز اگ برنامه رو در یک پروژه ساده با یه فرم انجام بدی میبینی جواب میده مشکل اینجاست که تو وسط اجرای برنامهت میخوای ریاستور کنی .به فرض اگه قبل از لاگین شدن به برنامت یعنی باز شدن دیتابیست این کد رو امتحان کنی میبینی جواب میده حالا منم دنبال اینم که میشه بدون خروج از برنامه ارتباط رو قطع و ری استور کرد؟

----------


## ammarkarimi

> ببین عزیز اگ برنامه رو در یک پروژه ساده با یه فرم انجام بدی میبینی جواب میده مشکل اینجاست که تو وسط اجرای برنامهت میخوای ریاستور کنی .به فرض اگه قبل از لاگین شدن به برنامت یعنی باز شدن دیتابیست این کد رو امتحان کنی میبینی جواب میده حالا منم دنبال اینم که میشه بدون خروج از برنامه ارتباط رو قطع و ری استور کرد؟


پست های اول این تایپیک رو نگاه کن.یک کدی هست که نمی دونم سینگل یوزر می کنه و ... از این حرف ها...
ببین چیزی سر در می یاری؟

----------


## jozef_rezaei

سلام به همه
زود تر مشكل رو حل كنيد من هم اين مشكل رو دارم
اگه تونستم حلش كنم حتما" به همه مي گم
خيلي ممنوع از كد هاي خوبي كه در وبلاگ گذاشتيد

----------


## jozef_rezaei

سلام به همه
زود تر مشكل رو حل كنيد من هم اين مشكل رو دارم
اگه تونستم حلش كنم حتما" به همه مي گم
خيلي ممنوع از كد هاي خوبي كه در وبلاگ گذاشتيد

----------


## Alen

مشکل کد mohammady2 برای restore این است که در connection string با DB ارتباط برقرار شده است که قرار است عمل restore بر روی آن انجام گیرد
برای حل این مشکل باید در connection string نام پایگاه داده مشخص نشود و یا با پایگاه داده master ارتباط برقرار شود (ضمن اینکه نباید کانکشن فعالی به آن DB داشته باشیم)

----------


## pars.engineer

شما اگر مطالب همين تاپيك رو به دقت مطالعه مي كرديد، جوابتان را مي گرفتيد.
به هر حال به لينك زير مراجعه كنيد(اين لينك را در چند پست قبل نيز گذاشته ام)
اگر مشكلتان حل نشد متن خطا را بگذاريد.
خود من از اين روش استفاده مي كنم و مشكلي ندارم.
https://barnamenevis.org/showthread.php?t=118712
به پست سوم و چهارم مراجعه نماييد.

موفق باشيد.

----------


## engineer.l.poolad77

> خوب اين كه معلومه كه از اين خط خطا مي گيرد. اينكه چه خطايي مي گيرد مهم است.
> به هر حال براي backUp كد زير را استفاده كنيد.
> 
> 
>  
> objCommand = 
> newSqlCommand("BACKUP DATABASE YourDataBase TO DISK = N'" + txtDataFileName.Text + "'" + 
> " WITH NOFORMAT, NOINIT, NAME = N'mydb-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10", objConnection); 
> objConnection.Open(); 
> ...


 
دستتون درد نکنه کدش درست و عالی هستش :تشویق:

----------


## Amir Oveisi

اینو ببینید
خیلی ساده و خیلی کامل 
http://www.geekpedia.com/tutorial180...databases.html
موفق باشید
jooje

----------


## danial82

گرفتن Backup و Restore کردن دیتابیس
https://barnamenevis.org/attach...2&d=1226600148

----------


## saied_genius

با سلام،

در هنگام Backup و Restore شما به بانك مورد نظر متصل هستيد.

معمولاً پس از Backup در آينده مي خواهيد از آن استفاده كنيد و Restore نماييد...

شايد بشود روش شما را اصلاح كرد ولي اگر بخواهيد به همان صورتي كه Backup گرفته ايد Restore نماييد ، به هيچ عنوان موفق نخواهيد شد.

زيرا ديتابيسي كه در حال استفاده است و اتصال شما به SQLServer از طريق آن است اجازه نمي دهد آنرا Restore نماييد. (حداقل در همه حالات جواب نمي دهد؛ و يك برنامه نويس بايد تمام حالت ها را در نظر بگيرد.)

شما مي توانيد براي اين كار ديتابيس در حال استفاده را از ديتابيس خود به "master" تغيير دهيد و پس از اتمام Backup و يا Restore به حالت اول بازگردانيد.

ولي من براي اين كار (چون خودم يك دور سر همين پدرم درآمده) يك Script نوشته ام كه ميتوانيد در برنامه خود به صورت Script فراخواني كنيد و يا آنرا به صورت Stored Procedure درآوريد. (كه بهتر است و راحت تر است)

اسكريپت Backup كه يك Stored Procedure براي Backup مي سازد.
 

USE [نام ديتابيس]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[BackupDB] 
@BackupPath varchar(max) 
AS 
backup database [نام ديتابيس] to disk =@BackupPath with INIT, SKIP, NOUNLOAD, STATS = 10 
RETURN


و

اسكريپت Restore كه يك Stored Procedure براي Restore مي سازد.

 

use [master]
GO 
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[RestoreDB] 
@BackupPath varchar(max) 
AS 
RESTORE DATABASE [نام ديتابيس] 
FROM DISK = " + "'" + RestorePath + "'" + " WITH RECOVERY, REPLACE 
RETURN


در صورت هرگونه سوال در خدمتم.

موفق باشيد.

----------


## DelphiFriend

سلام عالب بود ممنون.

----------


## alih210

سلام بر همه بر و بچ :قلب: 
سیتم backtp گیری Linq چه جوریه؟

----------


## saied_genius

> سلام عالب بود ممنون.


خواهش مي كنم عزيز ، قابل نداشت.

----------


## alisebt

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

*Cannot open backup device 'c:\\b.bak'. Operating system error 5(Access is denied.).
BACKUP DATABASE is terminating abnormally.*



آدرس رو روی هاست هم که میدم همین خطا رو میده.

----------

