PDA

View Full Version : save dialog



matinebi
سه شنبه 10 دی 1387, 20:42 عصر
چطور باید کدی مثل کد زیر رو برای save dialog نوشت

var
str,s,s1,s2,s3:string;
d:tdate;
begin
str:=ShellTreeView1.Path;
d:=date;
s:=DateToStr(d);
s1:=copy(s,1,4);
s2:=copy(s,6,2);
s3:=copy(s,9,2);
s:='backup_'+s1+'_'+s2+'_'+s3;
str:=str+'\'+s;
with form1.ADOCommand1 do
begin
CommandText:='BACKUP DATABASE Test TO DISK='+QuotedStr ( str);
execute
end;
ShowMessage('عملیات پشتیبان گیری با شکست مواجه شد');


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

shervin farzin
سه شنبه 10 دی 1387, 22:06 عصر
سلام
ميتونين از اين كد استفاده كنيد:

var
s,s1,s2,s3:string;
begin
s:=DateToStr(now);
s1:=copy(s,1,4);
s2:=copy(s,6,2);
s3:=copy(s,9,2);
s:='backup_'+s1+'_'+s2+'_'+s3+'.mdb';
SaveDialog1.FileName:=s;
SaveDialog1.Filter:='*.mdb|*.mdb';
if SaveDialog1.Execute then
ADOCommand1.CommandText:='BACKUP DATABASE Test TO DISK = '+QuotedStr(SaveDialog1.FileName);
try
ADOCommand1.Execute;
Except
ShowMessage('عملیات پشتیبان گیری با شکست مواجه شد');
end;

به دو نكته هم توجه داشته باشيد . اول اين كه در خط 8 ، جايي كه داريد نام فايل Backup رو
ميسازيد بايد در انتها پسوند فايل رو هم بنويسيد . من در كد بالا به عنوان مثال از پسوند
mdb استفاده كردم كه شما با توجه به پسوند فايل Database كه داريد بايد اون رو تغيير بدين
همچنين براي اين كه كاربر در محيط SaveDialog فايلهايي غير از پسوند mdb رو نبينه من در
خط 10 ، پسندهاي SaveDialog رو با همون پسند mdb فيلتر كردم .
موفق باشيد .

matinebi
چهارشنبه 11 دی 1387, 03:35 صبح
دوست عزیز برنامه این ارور رو میده

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

shervin farzin
چهارشنبه 11 دی 1387, 04:42 صبح
سلام
من اين كد رو چك كردم . هم براي حالت Backup و هم براي حالت Restore جواب ميده .
احتمالا در تعيين پسوند اشتباه داشتيد . به هر صورت من مجددا توابع مربوط به Backup و
Restore رو براتون ميذارم . اميدوارم مشكل رفع بشه .
يه Database به نام Test دارم در SQL . توجه داشته باشيد كه پسوند فايل Backup در SQl ،
bak.* هست . در ضمن چون موقع Restore امكان داره كه Database به نام Test اصلا وجود
نداشته باشه ، بايد ConnectionString مربوط به ADOCommand1 رو منتقل كنم به يه
Database كه ميدونم حتما هست مثل Master .
بنابر اين توابع رو به اين شكل قرار ميديم :

procedure TForm1.Back_up;
var
s,s1,s2,s3:string;
begin
ADOCommand1.ConnectionString:='Provider=SQLOLEDB.1 ;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=test';
s:=DateToStr(now);
s1:=copy(s,1,4);
s2:=copy(s,6,2);
s3:=copy(s,9,2);
s:='backup_'+s1+'_'+s2+'_'+s3+'.bak';
SaveDialog1.FileName:=s;
SaveDialog1.Filter:='*.bak|*.bak';
if SaveDialog1.Execute then
ADOCommand1.CommandText:='BACKUP DATABASE test TO DISK ='+QuotedStr(SaveDialog1.FileName);
try
ADOCommand1.Execute;
except
showmessage('Error');
end;
end;

procedure TForm1.Restore;
begin
ADOCommand1.ConnectionString:='Provider=SQLOLEDB.1 ;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=master';
SaveDialog1.Filter:='*.bak|*.bak';
if SaveDialog1.Execute then
ADOCommand1.CommandText:='RESTORE DATABASE test FROM DISK = '+QuotedStr(SaveDialog1.FileName);
try
ADOCommand1.Execute;
ADOCommand1.ConnectionString:='Provider=SQLOLEDB.1 ;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=test';
except
showmessage('Error');
end;
end;

matinebi
چهارشنبه 11 دی 1387, 11:50 صبح
کد شما را مقداری تغییر دادم و اکنون درست عمل میکند

var
s,s1,s2,s3:string;
begin
s:=DateToStr(now);
s1:=copy(s,1,4);
s2:=copy(s,6,2);
s3:=copy(s,9,2);
s:='backup_'+s1+'_'+s2+'_'+s3+'.bak';
SaveDialog1.FileName:=s;
SaveDialog1.Filter:='*.bak|*.bak';
try
if SaveDialog1.Execute then
DataModule5.ADOConnection1.Execute('backup database alamdar to disk='''+SaveDialog1.FileName+'''');
except
MessageDlg('عملیات پشتیبان گیری با شکست مواجه شد',mtError,[mbOK],0);
end;
end;

اما کد مربوط به رستور نه با کد شما نه با کد زیر هیچ کدام درست عمل نمیکنن و errorr را نمایش میدهند

begin
try
if OpenDialog1.Execute then
DataModule5.ADOConnection1.Execute('restore database alamdar from disk ='''+OpenDialog1.FileName+'''');
except
showmessage('Error');
end;
end;

shervin farzin
چهارشنبه 11 دی 1387, 16:17 عصر
سلام
من در پست قبلي خدمتتون عرض كردم ، اگر بخواين يك Table رو در Restore كنيد نبايد در اون
لحظه هيچ نوع Connection با اون Table داشته باشيد .
اشكال تابع Restore كه شما نوشتيد به نظر من فقط همينه كه هيچ Connection رو تغيير نداديد
من يك خط به كد شما اضافه كردم و تستش هم كردم ، هيچ مشكلي نداره . تابع Restore رو
به صورت زير بنويسيد :

begin
try
DataModule5.ADOConnection1.ConnectionString:='Prov ider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Master';
if OpenDialog1.Execute then
DataModule5.ADOConnection1.Execute('restore database alamdar from disk ='''+OpenDialog1.FileName+'''');
except
showmessage('Error');
end;
end;
بعد از اين كه فرايند Restore انجام شد با كد زير Connection رو برگردونيد به همون Table خودتون :

DataModule5.ADOConnection1.ConnectionString:='Prov ider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=alamdar';
اگر مجددا Error داد ، كد ها رو از بدنه Try Ecept خارج كنيد متن Error واقعي رو ببينيد ، بعد
اون متن رو روي سايت پست كنيد تا زودتر به نتيحه برسيم .
موفق باشيد.

matinebi
چهارشنبه 11 دی 1387, 16:49 عصر
این ارور رو میده

Operation is not allowed when the object is open

برای این که هیچ نوع کانکشنی از adoQuery ها به بانک نداشته باشیم چه کدی رو باید نوشت چون من فقط از adoQuery و adoCommand استفاده کردم

این کدی که شما نوشتید حتی اجازه نمیده opendialog اجرا شود من یک خط کد به آن اضافه کردم حالا opendialog اجرا میشه ولی این ارور رو میده
(البته بعد از 15 ثانیه مکث و قفل شدن برنامه)
Exclusive access could not be obtained because the database is in use.


DataModule5.ADOConnection1.Close;
DataModule5.ADOConnection1.ConnectionString:='Prov ider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Master';
if OpenDialog1.Execute then
DataModule5.ADOConnection1.Execute('restore database alamdar from disk ='''+OpenDialog1.FileName+'''');

shervin farzin
چهارشنبه 11 دی 1387, 21:10 عصر
سلام
خدا عمرت بده كه اصل پيام خطا رو نوشتي .
اين پيام داره ميگه در لحظه اي شما قصد اجراء تراكنش رو داريد يك برنامه ديگه هم هست كه
جدول مورد نظرتون رو باز كرده و اجازه اجراء تراكنش رو نميده . من حدس ميزنم كه شما
برنامه Enterprise Manager يا Query Analyzer رو باز كردين و از طريق اونها هم دارين بانكتون
رو بررسي ميكنيد . يا در حالت كلي يه برنامه ديگه يا يك AdoConnection ديگه در برنامه خودتون
داريد كه هم زمان به جدول alamdar متصل هست . شما بايد تمام ارتباط هايي رو كه حدس
ميزنيد با جدول وجود داره ببنديد . تا اينجا كه مشكل از كد برنامتون نيست .
موفق باشيد .

matinebi
چهارشنبه 11 دی 1387, 22:17 عصر
خوب بالاخره با این کد مشکل حل گردید ولی میخوام به جای کد ; close کدی بنویسم که نیازی نباشد برنامه بسته شود

var
s:string;
begin
DataModule5.ADOCommand1.CommandText:='Use Master';
DataModule5.ADOCommand1.Execute;
DataModule5.ADOCommand1.CommandText:='';

if not OpenDialog1.Execute then exit;
if OpenDialog1.Execute then
s:=OpenDialog1.FileName;

with DataModule5.ADOCommand1 do
begin
CommandText:='RESTORE DATABASE alamdar FROM DISK='+QuotedStr (s);
execute;
end;
MessageDlg('اطلاعات با موفقیت برگردانده شد',mtInformation,[mbOK],0);
close;
end;

که برای این مشکل از کد

DataModule5.ADOConnection1.ConnectionString:='Prov ider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=alamdar';
شما استفاده میکنم با این کد شما نیز مشکل حل نگردید

shervin farzin
پنج شنبه 12 دی 1387, 01:10 صبح
سلام
اول يه نكته در مورد كد خط 7 خدمتتون بگم :

if not OpenDialog1.Execute then exit;
نيازي به نوشتن اين خط نيست چون در اين صورت OpenDialog در برنامتون 2 مرتبه پشت سر
باز ميشه . فقط كافي بود باقي خط ها رو درون بدنه If در خط 8 قرار بديد .
اما در مورد Close منظورتون رو متوجه نشدم . چرا Close رو نوشتيد كه Form رو ببنده ؟
در ضمن كدي كه من براي تغيير Connection نوشتم فقط براي برگردوندن ارتباط قطع شده با
جدول alamdar بود ، البته ايده خود شما در خط 4 :

DataModule5.ADOCommand1.CommandText:='Use Master';
خيلي قشنگتره ، پس از همين روش براي برگشتن به جدول alamdar ، بعد از اتمام فرايند
Restore استفاده كنيد .
موفق باشيد .

matinebi
پنج شنبه 12 دی 1387, 06:48 صبح
من به جای خط ;close از کد
DataModule5.ADOCommand1.CommandText:='Use Master';
استفاده کردم اما اطلاعاتی که رستور شدن رو نمایش نمیده و باید حتما برنامه یکبار بسته بشه
در ضمن اگه تا قبل از بسته شدن برنامه به کدی مثل

ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('select * from sabt_moshtari');
ADOQuery2.open;
که برای رفرش بانک نوشتم در onclose فرم برسه ، ارور زیر رو میده و دیگه همون فرم بسته نمیشه

Invalid object name 'sabt_moshtari'

shervin farzin
پنج شنبه 12 دی 1387, 14:45 عصر
سلام
آقا يافتم . مشكل از اينه كه علاوه بر ADOQuery يه ADOCommand هم داريم كه مقدار ConnectionString براش تنظيم شده .
من اينو در نظر نگرفته بودم . اگر فرض كنيم كه شما در فرم DataModule5 فقط يك
Adoquery و يك Adocommand داشته باشيد اون وقت ، عمرا كه كد زير همچنان Error بده !!

var
s:string;
begin
DataModule5.ADOCommand1.ConnectionString:='Provide r=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=master';
DataModule5.ADOQuery1.Close;
DataModule5.ADOQuery1.ConnectionString:='';
if OpenDialog1.Execute then
begin
s:=OpenDialog1.FileName;
with DataModule5.ADOCommand1 do
begin
CommandText:='RESTORE DATABASE test FROM DISK = '+QuotedStr(s);
execute;
end;
MessageDlg('اطلاعات با موفقیت برگردانده شد',mtInformation,[mbOK],0);
end;
DataModule5.ADOQuery1.ConnectionString:='Provider= SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=alamdar';
DataModule5.ADOCommand1.ConnectionString:=ADOQuery 1.ConnectionString;
// Refresh Dataset
with DataModule5.ADOQuery1 do
begin
sql.Text:='select * from sabt_moshtari';
Open;
end;

موفق باشيد .

matinebi
پنج شنبه 12 دی 1387, 15:48 عصر
خوب یعنی باید به ازای هر adoQuery که شاید 15 تا بشه این کد رو بنویسم

DataModule5.ADOQuery1.Close;
DataModule5.ADOQuery1.ConnectionString:='';

فکر کنم همون نوشتن کد ;close به صرفه باشه

shervin farzin
پنج شنبه 12 دی 1387, 16:38 عصر
سلام
نه ، اگه تعداد ADOQuery هاتون زياده لازم نيست براي همشون اين كار رو بكنيد .
كافيه يك ADOconnection در فرم DataModule اضافه كنيد و به خاصيت Connection مربوط به
تمام AdoQuery ها به ADOconnection1 قرار بديد . بعد ConnectionString اون رو براي جدول
خودتون تنظيم كنيد . اون وقت ، اون كد رو فقط يك بار براي ADOconnection1 بنويسيد .
موفق باشيد .