# Native Code > برنامه نویسی در Delphi > بانک های اطلاعاتی در Delphi >  چگونگی گرفتن Backup  و Restore  کردن از اطلاعات SQL Server

## samandari

با سلام خدمت دوستان 
من میخواهم از داخل برنامه از اطلاعات ذخیره شده در داخل SQL Server  پشتیبان گیری کنم یعنی کاربری که Sql Server  بلد نیست بتواند به راحتی از داخل برنامه پشتیبانگیری کرده و یا اطلاعات پشتیبانگیری شده را برگرداند.

----------


## m-khorsandi

درود

میتونی این Command رو با استفاده از StoredProcedure  یا Query اجرا کنی:

backup database pubs to disk = 'c&#58;\pubs.bak'


البته این یه مثال خیلی ساده ست، حتما میدونی که  Backup  چقدر پارامتر داره!!؟؟

----------


## ahmadr

می تونی از این استفاده کنی :


try
  if SaveDialog1.Execute then
  ADOConnection1.Execute('backup database Pubs to disk='''+SaveDialog1.FileName+'''');
 except
 MessageDlg('عملیات پشتیبان گیری با شکست مواجه شد',mtError,[mbOK],0);
end;<span dir=ltr></span>

----------


## majid_afra222

سلام
کدهای نوشته شده توسط دوستان تنها در حالتیکه بر روی سرور دستور اجرا شود صحیح است
ولی اگر میخواهی از روی کلاینتها هم اجازه Backup و Restore بدی بهتره کد زیر رو استفاده کنی
همه Backup ها بر روی سرور و در پوشه ای به نام Backup در محل فیزیکی خود بانک اطلاعاتی ایجاد میشود

مثلا برای Northwind

تعیین محل فیزیکی بانک روی سرور راه دور
رشته پرس و جوی استفاده شده
SELECT filename FROM sysdatabases WHERE name = 'Northwind'

مسیر فیزیکی بر روی سرور برای بانک انتخاب شده
E&#58;\Program Files\Microsoft SQL Server\MSSQL\data

ایجاد پوشه فیزیکی جدید برای پشتیبانها روی سرور با دستور
EXEC master..xp_cmdshell &#91;md "E&#58;\Program Files\Microsoft SQL Server\MSSQL\data\Backup"&#93;

تهیه پشتیبان از بانک اطلاعاتی با استفاده از دستور
BACKUP DATABASE &#91;Northwind&#93; TO DISK = 'E&#58;\Program Files\Microsoft SQL Server\MSSQL\data\Backup\BackupNorthwind_Bak.bak' WITH INIT,  NAME = N'Northwind_Bak', STATS = 10

برای بازیابی بانک اطلاعاتی
رفتن به مود تک کاربره با استفاده از پرس و جوی زیر
EXEC sp_dboption 'Northwind', 'single user', 'true'

تعیین محل فیزیکی بانک روی سرور راه دور
رشته پرس و جوی استفاده شده
SELECT filename FROM sysdatabases WHERE name = 'Northwind'

مسیر فیزیکی بر روی سرور برای بانک انتخاب شده
E&#58;\Program Files\Microsoft SQL Server\MSSQL\data

بازیابی اطلاعات با استفاده از پرس و جوی زیر
 RESTORE DATABASE &#91;Northwind&#93;  FROM DISK = 'E&#58;\Program Files\Microsoft SQL Server\MSSQL\data\Backup\BackupNorthwind_Bak.bak' WITH REPLACE  , NOUNLOAD ,  STATS = 10,  RECOVERY 

خروج از مود تک کاربره با استفاده از پرس و جوی زیر
EXEC sp_dboption 'Northwind', 'single user', 'false'

----------


## مجتبی جوادی

آقای مجید افرا 222 تشکر از لطف شما ولی بنده با یک مشکل موجه شده ام و وقتی می خواهم برنامه را Restore کنم پیغام زیر ظاهر می گردد 
بانک مورد نظر توسط کاربر دیگری مورد استفاده قرار گرفته است
لطفا کمک کنید
با تشکر

----------


## soroush_vs

خب شاید Enterprise Manager هم اکنون اجرا است

----------


## mzjahromi

اگر چه قبلا در این مورد زیاد بحث شده ولی
علاوه بر اونی که سروش(محمود) گفت ممکنه برنامه خودتون داره ازش استفاده میکنه که در این صورت قبل از ارسال این دستورات کافیه دستور زیر رو ارسال کنی.

use master

اگر باز هم با مشکلی مواجه شدی در بخش SQL Server یه جستجو بکن در این مورد بحثهای کاملی شده است

----------


## حرفه ای

بچه ها من یک component خوب دارم که یکی دو بار که این سوال مطرح شد گداشتم روی سایت چند وقتی از اون استفاده می کنم از کل بانک اطلاعاتی به راحتی در حال استفاده کپی می گیرم
اگه خاستید دوباره روی سایت می گذارم 

می تونی از دستور Backup database و restore database هم استفاده کنی به راحتی جواب می ده

----------


## bahar_2006

> سلام
> کدهای نوشته شده توسط دوستان تنها در حالتیکه بر روی سرور دستور اجرا شود صحیح است
> ولی اگر میخواهی از روی کلاینتها هم اجازه Backup و Restore بدی بهتره کد زیر رو استفاده کنی
> همه Backup ها بر روی سرور و در پوشه ای به نام Backup در محل فیزیکی خود بانک اطلاعاتی ایجاد میشود
> 
> مثلا برای Northwind
> 
> تعیین محل فیزیکی بانک روی سرور راه دور
> رشته پرس و جوی استفاده شده
> ...


سلام 
می شه بیشتر توضیح بدین ؟چطور باید از این کد ها استفاده کنیم؟
با تشکر

----------


## fotondiamond

حرفهای جون کامپوننت رو بذار لطفا

----------


## shima_r

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

try
  Dm.ADOConnection1.Execute('backup database   نام دیتابیس  to disk = '''+pathback+''' ');
  MessageDlg('عملیات پشتیبان گیری با موفقیت انجام شد',mtInformation,[mbOK],0);
except 
  MessageDlg('عملیات پشتیبان گیری با شکست مواجه شد',mtError,[mbOK],0);

----------


## ghulam yahya ayobi

> بچه ها من یک component خوب دارم که یکی دو بار که این سوال مطرح شد گداشتم روی سایت چند وقتی از اون استفاده می کنم از کل بانک اطلاعاتی به راحتی در حال استفاده کپی می گیرم
> اگه خاستید دوباره روی سایت می گذارم 
> 
> می تونی از دستور Backup database و restore database هم استفاده کنی به راحتی جواب می ده


دوست عزیز اگر این کامپننت را بگذاری لطف میکنی و اگر برای مناین کامپوننت را با کد بکاپ و ریستور را به من ایمل کنی از شما یک جهان ممنون میشوم چونخیلی خیلی  کارم گیر است و اگر قیمت دارد شماره حساب بده تا به حساب واریز کنم منتظر هستم دوست عزیز
yahya_inlucky2006@yahoo.com

----------


## hesam_a110

با سلام به همگی 
من تویه restore کردن به error
Msg 233, Level 20, State 0, Line 0
A transport-level error has occurred when sending the request to the server. (provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.)
برخوردم چه کار کنم

----------


## nader kianey

> بچه ها من یک component خوب دارم که یکی دو بار که این سوال مطرح شد گداشتم روی سایت چند وقتی از اون استفاده می کنم از کل بانک اطلاعاتی به راحتی در حال استفاده کپی می گیرم
> اگه خاستید دوباره روی سایت می گذارم 
> 
> می تونی از دستور Backup database و restore database هم استفاده کنی به راحتی جواب می ده


 سلام می خواهم این دو کامپوننت را برایم ارسال کنید 
nadercpu@yahoo.com

----------


## matinebi

try
if SaveDialog1.Execute then
ADOConnection1.Execute('backup database Pubs to disk='''+SaveDialog1.FileName+'''');
except
MessageDlg('عملیات پشتیبان گیری با شکست مواجه شد',mtError,[mbOK],0);
end;

با این کدی که قرار داده اید پس از هر بار گرفتن بکاپ حجم فایل بکاپ دو برابر میشه 
لطفا راهنمایی کنید

----------


## sahar480

دوست عزیز اگر این کامپننت را بگذاری لطف میکنی و اگر برای من این کامپوننت را با کد بکاپ و ریستور را به من ایمل کنی از شما یک دنیا ممنون میشوم sahar_msi17@yahoo.com

----------


## saied_genius

براي RESTORE كرد ديتابيس SQL شما بايد ابتدا دسترسي به بانك را محدود به يك دسترسي نماييد. (كه آ ن هم دسترسي خود Restore است)

و سپس اقدام به RESOTRE نماييد.

براي دسترسي محدود :


ALTER DATABASE MyDatabase SET SINGLE_USER


و يا


EXEC sp_dboption 'MyDataBaseName','single user','TRUE'


و سپس از هر نوع RESTORE كه دوست داري استفاده كن.

همان RESTORE كه استفاده كرده اي خوب است از همان استفاده كن.
و يا از لينك زير استفاده كنيد.

https://barnamenevis.org/showth...=120434&page=3

**نكته: تنظيم ديتابيس به حالت تك كاربره پس از بازيابي اطلاعات به صورت اتوماتيك به حالت چند كاربره باز مي گردد.

موفق باشيد.

----------


## java.source.ir

> سلام
> کدهای نوشته شده توسط دوستان تنها در حالتیکه بر روی سرور دستور اجرا شود صحیح است
> ولی اگر میخواهی از روی کلاینتها هم اجازه Backup و Restore بدی بهتره کد زیر رو استفاده کنی
> همه Backup ها بر روی سرور و در پوشه ای به نام Backup در محل فیزیکی خود بانک اطلاعاتی ایجاد میشود
> 
> مثلا برای Northwind
> 
> تعیین محل فیزیکی بانک روی سرور راه دور
> رشته پرس و جوی استفاده شده
> ...


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

----------


## emdadgar_shahed

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

----------


## java.source.ir

سلام
emdadgar_shahed عزیز؛ در رابطه با سوال اولتون باید به صورت زیر عمل نمایید تا بانک شما از حالت تک کاربره خارج شود (این دستور را بعد از انجام عملیات restore قرار دهید.):
EXEC sp_dboption 'Northwind', 'single user', 'false'

اگر بخواهید دستورات اشاره شده را در محیط SQL Server انجام دهید باید ابتدا یک Store Procedure ایجاد نمایید و سپس دستورات زیر را در آن وارد نمایید:
عملیات پشتیبان گیری:
CREATE PROCEDURE backupOP
	@destination nvarchar(900),	
	@fileName nvarchar(900)
as	
BACKUP DATABASE [IIMDB] 
TO DISK = @destination
WITH INIT,  NAME = @fileName, STATS = 10;

عملیات بازیابی:
CREATE PROCEDURE restoreOP
	@destination nvarchar(900)
as
EXEC sp_dboption 'IIMDB', 'single user', 'true';

RESTORE DATABASE [IIMDB]  
FROM DISK = @destination 
WITH REPLACE  , NOUNLOAD ,  STATS = 10,  RECOVERY;

EXEC sp_dboption 'IIMDB', 'single user', 'false';

موفق و سربلند باشید.

----------


## error682

1- اگه بخوام از کل دیتابیس Backup بگیرم باید از روش بالا استفاده کنم؟
آخه برنامه ای که دارم مینویسم تا دلتون بخواد  Table داره...
اگه بخوام از تک تک جدول ها جداگانه Backup بگیرم تا فردا طول میکشه...
2- برای Restore کردن ، به چه صورت اطلاعات رو برمیگردونه؟
منظورم اینه که Append میکنه یا جایگزین میکنه؟ درکل : چه بلایی به سر رکوردهای تکراری میاد؟
و به چه صورت Restore کنم که رکورد تکراری نداشته باشم؟
آخه توی چند قسمت نیاز هست که به همون جدول Restore کنم...  :متفکر:

----------


## xboycooper

سلام دوستان  :چشمک: 
من موقع restore کردن اطلاعات یک لودینگ گذاشتم ولی در زمان انجام restore برنامه هنگ میکنه و کار restore انجام میشه و بعد از اینکه عملیات تموم شد تازه لودینگ شروع به حرکت میکنه !

میشه راهنمایی کنید چطور میتونم همزمان و در حال بازگشت اطلاعات لودینگ هم کار کنه .
ممنون .

----------


## saied_genius

از Multi threading براي restore استفاده کنيد.

موفق باشيد.

----------


## ss_sss733

با سلام خدمت دوستان
چگونه مي توان بانك sql  را restore  كنم
--------------------
لطفا كد بازيابي در سي شارپ ساده برام بفرستيد ممنونم

----------


## YkA1363

> می تونی از این استفاده کنی :
> 
> 
> try
>   if SaveDialog1.Execute then
>   ADOConnection1.Execute('backup database Pubs to disk='''+SaveDialog1.FileName+'''');
>  except
>  MessageDlg('عملیات پشتیبان گیری با شکست مواجه شد',mtError,[mbOK],0);
> end;<span dir=ltr></span>


اين كد خيلي باحال بود براي بازيابي هم يك open dialog گذاشتم و كد زير رو نوشتم:
if (openDialog1.Execute) then begin
dm.ADOConnection1.Execute('use master RESTORE DATABASE db FROM DISK='''+OpenDialog1.FileName+'''');
 فقط دو تا سووال:
1: وقتي فايل رو بازيابي مي كنم بايد حتما برنامه رو ببندم و باز كنم تا بتونم از برنامم استفاده كنم. براي رفع مشكل adoconnection  را يك بار باز و بسته كردم مشكل حل شد ولي اطلاعاتي كه در ركورد از كمبوباكس وارد شده بود(چند تا آيتم ثابت داخل كمبوباكس وارد كردم) رو با حروف ناشناخته نشون مي ده كه اون هم با اجراي دوباره برنامه درست مي شه. چطور مي تونم اين مشكل رو رفع كنم؟
2ـ اين روش راه خوبي براي backup گرفتن هست يا نه؟

----------

