# Native Code > برنامه نویسی در Delphi > بانک های اطلاعاتی در Delphi >  آموزش طریقه ساخت datbase در sql و restore کردن فایل backup توسط یک برنامه دلفی!

## oghab

سلام

(براي ديدن نسخه جديد restore كردن به صفحه دوم برويد و يا لينك زير را ببنيد:
https://barnamenevis.org/showth...052#post624052
و گرفتن backup از پايگاه داده در sql توسط دلفي لينك زير را
https://barnamenevis.org/showthread.php?t=32985
اين پرانتز در تاريخ 9 آبان 87 اضافه شد)

به این روش می تونید با استفاده از backup ای را که database تون تو sql گرفتید. توسط یک برنامه دلفی ساده databse را  در sql در كامپيوتر ديگري ساخته و توسط همین برنامه با تمام table های دورنش و اطلاعات آنها restore کنید
یک adoconneciton روی فرم بگذارید! سپس روی سه نقطه خصوصیconncetion string کلیک کرده. build کلیک کرده. microsoft OLE DB Provider for SQL Server را ناتخاب کرده و next بزنید و use windows Nt را انتخاب کنید و next بزنید! test conection و ok و ok
سپس یک adocommand روی فرم بگذارید. و خصوصیت connection آنرا را برابر adoconnection1 انتخاب کنید.
یک button برای ساخت database  ویکی برای restore در نظر بگیرید!
در رویداد کلیک buuton اول این کد را بنویسید!

procedure TForm1.Button1Click(Sender: TObject);
begin
with ADOCommand1 do
begin
    CommandText:='CREATE DATABASE mydatabase1';
    execute
end;
ShowMessage(' پایگاه داده موفقیت آمیز ساخته شد');
end;

البته به جای mydatabase1 نام database خودتان را بنویسید!

در همان فولدری که exe این برنامه را قرار می دهید. backup مورد نظر را نیز قرار دهید!
و دو رویداد کلیک button دوم این کد را بنویسید!

procedure TForm1.Button2Click(Sender: TObject);
var
  s:string;
begin
s:=ExtractFilePath( Application.ExeName );;
s:=s+'MYBACKUP';
 with ADOCommand1 do
    begin
       CommandText:='RESTORE DATABASE mydatabase1 FROM DISK='+QuotedStr (s);
       execute
    end;
ShowMessage('فایل پشتیبان موفقیت آمیز احیا شد');
end;

ایبته به جای mybackup نام backup خودتان را بنویسید!
و به جای mydatabase1 اسم database خودتون را!
این برنامه را تازه ساختم. و تا جایی چک کردم درست بود! ولی اگه هر ایراد و انتقادی باشه با کمال میل می پذیرم.
موفق باشید!
نمونه برنامه را هم ضمیمه کردم!
موفق باشید!

----------


## ehsan2000

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

----------


## disappear

خیلی عالی بود .

----------


## oghab

سلام
ممنونم
قابلی نداشت
موفق باشید!

----------


## hac0de

man chand vaght bod roye in gir karde bodam mamnon
movafagh bashid

----------


## oghab

خواهش می کنم
شما هم موفق باشید!

----------


## ماریا وکیلی

عقاب جان منتظر آموزش های بعدی  شما هستیم

خیلی عالی بود

----------


## newdesign

تو بانک اکسس هم میشه استفاده کرد ؟ اگه آره ؟لازمه تغییری تو code داده بشه ؟

----------


## babak869

عالی بود آفرین من تست کردم ایرادی نداشت
موفق باشید

----------


## oghab

ممنون از همگی
خوشحالم که مفید بود
در مورد اکسس هم. احتمال زیاد راهش هست. ولی من چون با اکسس کار نکردم :خجالت:  . بلد نیستم!

----------


## eilia_43

دست شما درد نکنه

----------


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

ولی برنامه شما یک ایراد دارد و آن اینکه اگر کلید ایجاد دیتابیس را مجددا فشار دهیم برنامه پیغام خطا می دهد که دیتا بیس قبلا ایجاد شده است . حالا بفرمایید چگونه می توان اول چک کرد که دیتابیس مورد نظر وجود دارد یا نه؟ اگر موجود نبود ایجاد گردد و اگر موجود بود برنامه کنسل و یک پیغام نمایش داده شود .
با تشکر

----------


## babak869

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

.......
Button1.Enabled:=False;

----------


## davoodmz

دوست من دست شما درد نکنه- عالی بود
یک بار دیگر بک آپ گیری از sql با کدهای دلفی هم محبت کرده بودین که یک مشکل داشت لطفاً اونم همین اینجا کدشا بگذارید هم اینکه مشکلشا  حل نمایئد:
کدی که برای بک آپ گیری بود: اگر یک بار بک آپ میگرفتی - بار دوم در یک روز بک آپ تکرار میشد  ظرفیت بک آپ دو برابر اگر چندین بار عمل بک اپ گیری را تکرار میکردیم باز هم ظرفیت اضافه میشد.

ضمناً آقا بابک سوال آقای جوادی هم سوال خوبی است  و به نظر من باید جوابی دیگر برای اون پیدا کرد.

باتشکر از همه- داود

----------


## Dolphin

با عرض سلام بعد از یکسال 
دوست گرامی آیا میشه از ابزارهای sql view یا حتی از تگهای اون هم استفاده کرد

----------


## oghab

با سلام خدمت دوستان عزیز
ممنوم از نکته ها  و انتقاداتتون
انتقاد سازنده است و رفع این اشکالات در برنامه و در نظر گرفتن بعضی از نکته ها به کامل شدن برنامه و بهتر شدن اون کمک می‌کنه
اما متاسفانه الان حدود 7-8 ماهی است که من از دنیای برنامه نویسی دور افتادم و کار خاصی نکردم
الان هم حال و حوصله و فرصت پرداختن بهش ندارم (امیدوارم پیدا کنم)
بهر حال این برنامه هر چند کاربردی برنامه مشکلی نیست و زحمت چندانی براش نکشیدم و فکر می کنم همه شما دوستان گرامی با توجه به source برنامه و توضیحاتش، روند برنامه را متوجه شدید و کد آنچنانی هم نداره که تغییز دادنش مایه دردسر بشه.
پس انتقاداتتون و نکاتی که فکر می‌کنید بهتره داشته باشه را خودتون به برنامه اضافه کنید، با کمی تلاش و جستجو و سوال می‌تونید راهی پیدا کنید که ببینه database ی با این نام موجود هست یا نه و  با یه if و چک کردنش پیغام بده که این databse موجود است و عمل create database انجام نشه و پیغام خطا نده
و یا چک کنید فایلی با نام backup امروز وجود داره یا نه و اگه وجود داره backup جدید را با یه اسم دیگه بسازه و یا فایل قبلی را حذف و backup جدید را جایگزین کنه تا مشکل چند برابر شدن حجم فایل بوجود نیاد
من نمیدونم چطور میشه یه فایل را از روی هارد توسط دلفی پاک کرد یا چطور میشه چک کرد فایلی با این نام در این مسیر وجود داره، ولی حتما راهی داره، و فکر نمی‌کنم راه سختی باشه . اگه تو همین انجمن جستجو کنید ممکنه قبلا مطرح شده باشه و راهشو پیدا کنید و اگه نبود در یه تاپیک جدید از دوستانی که در امر دلفی واردترند و همیشه راهنماییهاشون ارزنده است، بپرسید.
و بعد این برنامه را تغییر بدید و اشکلاتشو برطرف کنید
من روش restore  کردن را از طریق جستجو در تاپیک های هم انجمن پیدا کردم و این برنامه را اونطور که فکر می‌کردم بهتره درست کردم و به عنوان نمونه اینجا قرار دادم چون فکر می‌کردم کاربردیه
شما هم می‌تونید با یه مقدار جستجو  و کمک گرفتن اونو اصلاح کنید و هم خودتون استفاده کنید و هم اینجا برای استفاده دیگر دوستان قرار بدید
و یا برنامه را طبق نیاز خودتون در برنامه خودتون سفارشی کنید. این برنامه یه نمونة ساده است

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

----------


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

آقای احدی شما درست می فرمایید . می توان بعد ازایجاد کردن بانک کلید را غیر فعال کرد اما این غیر فعال کردن دائمی نیست زیرا گر برنامه بسته و دوباره اجرا گردد باز هم کلید فعال می شود و دوباره باید عمل چک کردن انجام گردد .

----------


## Good Looking

خیلی عالی بود
منتظر يك همچين نكته هاي نابي هستم

----------


## pm_hamze

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

----------


## vcldeveloper

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


اولا ما با کسی اینجا پدرکشتگی نداریم!
ثانیا اینجا محل مطرح کردن انتقادها نیست!
ثالثا، به تاریخ ایجاد تاپیک (سال 84) دقت کنید.
رابعا، این بنده خدا در حدود یک پاراگراف توضیح نوشته + یک سورس کد تا مسئله و راه حل آن را توضیح بده. مشکل تاپیک های شما این بود که عنوان "مقاله" داشتند، ولی در آنها هیچ مطلبی جزء یک سورس کد وجود نداشت. به همین دلیل هم از شما خواسته شد که اینگونه مطالب را که جنبه نکته دارند، در تاپیک نکات مطرح کنید.
همینجا یک نکته را هم به شما تذکر بدم؛ دوست عزیز، ارسال پست های بی خود برای بالا آوردن تاپیک در این سایت خلاف قوانین هست. شما عادت کردید که هر چند وقت که یکی از تاپیک هاتون بی جواب میمونه، یک پست بی ربط در اون تاپیک میزنید و تاپیک را بالا میارید! تا بحال چندین بار اینگونه پست های شما پاک شده، ولی باز هم توجه نمی کنید. اگر این روند ادامه داشته باشه، مطابق قوانین سایت بابت ارسال اینگونه پست ها جریمه و امتیاز منفی دریافت می کنید!
اگر می خواید تاپیکی را که به جواب نرسید، بالا بیارید، در پست جدید خود به نکات جدیدی که در اون زمینه خودتان در این مدت آزمایش کردید، یا به آنها پی بردید، بپردازید، یا توضیحات بیشتری درباره سوال خود مطرح کنید، نه اینکه مطالبی مثل "همچنان منتظریم"، "کسی نبود؟!" و... ارسال کنید.

----------


## jafar_mollaei

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

----------


## hentjanson

سلام به تمام اساتید این برنامه میشه بانکش اکسس باشه میشه در این رابطه هم مثالی بزنید

----------


## oghab

سلام
اين فقط يه نمونه برنامه ساده است و خيلي ايرادها و نقصها مي تونه داشته باشه
و هر كس بنا به نياز خودش ميتونه هر قسمتي اش را تغييرش بده
موفق باشيد

----------


## oghab

سلام
سعي كردم برنامه قبلي را كاملتر كنم و بزارم
برنامه قبلي خيلي ساده بود. و بيشتر براي اين كاربرد داشت كه بار اول كه ميخواهيم برنامه را در يك كامپيوتر استفاده كنيم database مورد نظرمون را اول بسازيم و بعد پايگاه داده مون را روش restore كنيم.
ولي اين برنامه براي اينكه كه backup هاي را كه گرفتيم بتونيم انتخاب و restore كنيم.
وقتي كه به database وصليم نميشه عمل restore را انجام داد و با پيغام database in use مواجه ميشيم. براي همين من تو برنامه اصلي اين كار را نميكنم و يه برنامه جدا براش مي‌سازم. البته ميشه تو همون برنامه اصلي هم گذاشت و ارتباط  بقيه adoconnection ها را به database مورد نظر قطع و دوباره وصل كرد. ولي خب ساخت يه برنامه جدا راحتتره. حالا شما مختاريد

**************************************************  ************
یک adocommand روی فرم بگذارید! سپس روی سه نقطه خصوصیconncetion string کلیک کرده. build کلیک کرده. microsoft OLE DB Provider for SQL Server را انتخاب کرده و next بزنید و use windows Nt را انتخاب کنید و next بزنید! test conection و ok و ok
دقت كنيد نام database را انتخاب نكنيد
يك ShellListView1 روي فرم بگذاريد براي انتخاب فايل مورد نظر.
ShellComboBox1 براي دسترسي راحتتر به درايوها
و خاصيت ShellComboBox  مربوط به كنترل ShellListView1 را برابر ShellComboBox1 قرار دهيد
و يك button براي انجام restore كد آن به شرح زير است:

procedure TFrmRestore.Button2Click(Sender: TObject);
var
  s:string;
begin
    if ShellListView1.selectedfolder.PathName ='' then
      ShowMessage('Please Select the file')
    else
      begin
          s:=ExtractFileExt(ShellListView1.selectedfolder.Pa  thName);
          if Length(s)>0 then
            ShowMessage('Type of the file is not valid')
          else
            begin
              try
                 begin
                  with ADOCommand2 do
                    begin
                         CommandText:='RESTORE DATABASE MyDataBase FROM DISK='+QuotedStr (ShellListView1.selectedfolder.PathName);
                         execute
                    end;
                    ShowMessage('DataBase has Successfully Restore');
                 end;
               except
                  ShowMessage('Please Close any releated Programs and Select a True type file');
               end;
            end;
     end;
end;


    if ShellListView1.selectedfolder.PathName ='' then  چك ميكنه فايلي انتخاب شده است يا نه!


          s:=ExtractFileExt(ShellListView1.selectedfolder.Pa  thName);
          if Length(s)>0 then
            ShowMessage('Type of the file is not valid')


چك ميكند فايل انتخابي از نوع ديگري مثلا عكس نباشد. ولي در اينجا يك مشكل دارد. اگر يك فولدر انتخاب شود تشخيص نمي دهد و باعث بروز خطا مي شود. از آنجا كه فايل بك آپ اس كيو ال داراي پسوند نيست. من نتونستم براي افتراق اون از يك فولدر راهي پيدا كنم


with ADOCommand2 do
                    begin
                         CommandText:='RESTORE DATABASE MyDataBase FROM DISK='+QuotedStr (ShellListView1.selectedfolder.PathName);
                         Execute


و كد بالا هم عمل resotore را انجام ميدهد.

**************************************************  ******************
خب اين برنامه حتما هنوز ايرادات و نواقصي داره كه به بزرگي خودتون ببخشيد
متاسفانه من اكسس بلد نيستم و درباره ش نميتونم چيزي بگم. و در زمينه شبكه هم خيلي بي سوادم و بيشتر نياز به راهنمايي ديگران دارم.
موفق باشيد
التماس دعا

پ.ن. فايل نمونه ضميمه شده

----------


## karimi.ali2005

برای تشخیص اینکه فولدر انتخاب شده یا نه if DirectoryExists(ShellListView1.Selectedfolder.Path  Name) then
 begin

----------


## mamali_zeshte

ممنون از کدتون ولی وقتی aql در حالت start باشه پیغام database in use میده و وقتی که stop باشه پیغام [DBNETLIB][ConnectionOpen (Connect()).]SQL Server does not exist or access denied'. Process stopped. Use Step or Run to continue. میده ! مشکل رو اگه بگید ممنون میشم :چشمک:

----------


## vcldeveloper

> ممنون از کدتون ولی وقتی aql در حالت start باشه پیغام database in use میده و وقتی که stop باشه پیغام [DBNETLIB][ConnectionOpen (Connect()).]SQL Server does not exist or access denied'. Process stopped. Use Step or Run to continue. میده ! مشکل رو اگه بگید ممنون میشم


SQL Server باید Start باشه، ولی Database ایی که میخواید ازش Backup بگیرید، یا Restore کنید، نباید In use باشه؛ یعنی نباید کانکشنی اون دیتابیس رو باز کرده باشه.

----------


## mamali_zeshte

مرسی آقای کشاورز :تشویق:

----------


## matinebi

لطف کنین یک SAMPLE  کامل برای بکاپ و رستور گیری قرار دهید ممنون میشم
فایل restor87 مشکل داره

----------


## Mersen

ولي اين برنامه براي اينكه كه backup هاي را كه گرفتيم بتونيم انتخاب و restore كنيم.
وقتي كه به database وصليم نميشه عمل restore را انجام داد و با پيغام database in use مواجه ميشيم. براي همين من تو برنامه اصلي اين كار را نميكنم و يه برنامه جدا براش مي‌سازم. البته ميشه تو همون برنامه اصلي هم گذاشت و ارتباط بقيه adoconnection ها را به database مورد نظر قطع و دوباره وصل كرد. ولي خب ساخت يه برنامه جدا راحتتره. حالا شما مختاريد


سلام من می خواستم توی برنامه خودم این کار رو انجام بدم هرکاری هم می کنم نمی تونم اتصال adoconnection رو قطع کنم اگه میشه لطفا کمک کنید ممنون می شم بگید کجا باید این کار رو انجام بدم و چه طور!!! :متعجب:  :خجالت:

----------


## vcldeveloper

> هرکاری هم می کنم نمی تونم اتصال adoconnection رو قطع کنم


AdoConnection.Close

----------


## ahmadbh

چطور ميشه كه Database را Open كرد و از آن استفاده كرد و تاريخ Bachup آن در برنامه مشخص كنيم و چطور ميشود آن را بر روي يك درايو ديگه ذخيره كرد
با تشكر صميمانه از شما

----------


## 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

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

موفق باشيد.

----------


## hmahdavi921

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

----------


## sempaisaleh

با سلام من از اين كد استفاده كردم. پيغام پشتيبان گيري با موفقيت انجام شد رو ميده ولي هيچ كاري انجام نميده. يعني هيچ بك آپ اي نميگيره.
ADOCommand1.CommandText:='use TadbirAsak91 BACKUP DATABASE TadbirAsak91 TO DISK='+QuotedStr (ExtractFilePath(Application.ExeName)+'backup\MYBA  CKUP.Bak');
ADOCommand1.execute;
ShowMessage('پشتيبان گيري با موفقيت انجام شد');

----------

