ورود

View Full Version : نحوه تهيه Backup و Restore كردن ديتا بيس از Client



سیروس مقصودی
سه شنبه 31 خرداد 1390, 08:35 صبح
با سلام

من يك برنامه حسابداري نوشته ام و روي سرور نصب شده وقتي عمليات Backup گيري و Restore را كاربر از روي سرور انجام ميدهد اين عمليات براحتي انجام ميگيرد ولي وقتي كاربر اين عمليات را از روي Client انجام ميدهد و ميخواهد از اطلاعات روي Client خود Backup تهيه نمايد اين عمليات بدرستي انجام نميشود يعني روي Client هيچ Backupي تهيه نميشود . مشكل كار كجاست (من از SqlServer 2000 استفاده ميكنم) ؟

با تشكر فراوان ...

a_mosavian
سه شنبه 31 خرداد 1390, 16:34 عصر
من عادت ندارم کدهای برنامه خودم رو در اختیار دیگران قرار بدم اما استثنا برای شما نوشابه باز می کنم. ود زیر انتقال فایل از روی سرور به کلاینت رو انجام میده. توضیح اینکهمن در برنامه م از UniDAC بهره گرفتم، اگر از ADO یا dataSnap بهره می گیرید نیاز هست کمی تغییر بدید که گمان نکنم کار سختی باشه.
procedure TDataModule2.MoveFileFromServer(FileName: string; RemoteFile: string; AremoteTempPath: string; Conn: TUniConnection);
var
qTemp: TUniQuery;
temporaryTableName, SQLText: string;
DBList: TStringList;
begin
try
Randomize;
DBList := TStringList.Create;
Conn.GetDatabaseNames(DBList);
if DBList.IndexOf('bkdb') >= 0 then begin
Conn.ExecSQL('USE [master]', []);
Conn.ExecSQL('ALTER DATABASE [bkdb] SET SINGLE_USER WITH ROLLBACK IMMEDIATE', []);
Conn.ExecSQL('USE [master]', []);
Conn.ExecSQL('DROP DATABASE bkdb', []);
end;
DBList.Free;
Conn.ExecSQL('CREATE DATABASE bkdb', []);
temporaryTableName := 'bkdb.dbo.bltlb' + IntToStr((Random(10000000)));
Conn.ExecSQL('USE bkdb', []);
SQLText := Format('CREATE TABLE %s (bck VARBINARY(MAX))', [temporaryTableName]);
Conn.ExecSQL(SQLText, []);
SQLText := Format('INSERT INTO %s SELECT bck.* FROM OPENROWSET(BULK ''%s\%s'',SINGLE_BLOB) bck', [temporaryTableName, AremoteTempPath, RemoteFile]);
Conn.ExecSQL(SQLText, []);
SQLText := Format('SELECT bck FROM %s', [temporaryTableName]);
qTemp := TUniQuery.Create(Self);
qTemp.Connection:=Conn;
qTemp.SQL.Text := SQLText;
qTemp.ReadOnly:=True;
qTemp.Open;
TBlobField(qTemp.FieldByName('bck')).SaveToFile(Fi leName);
qTemp.Free;
SQLText := 'EXEC master..xp_cmdshell ' + QuotedStr('del ' +AremoteTempPath + '\' + RemoteFile);
Conn.ExecSQL(SQLText, []);
Conn.ExecSQL('USE [master]', []);
Conn.ExecSQL('ALTER DATABASE [bkdb] SET SINGLE_USER WITH ROLLBACK IMMEDIATE', []);
Conn.ExecSQL('USE [master]', []);
Conn.ExecSQL('DROP DATABASE bkdb', []);
except
on E: Exception do begin
Conn.ExecSQL('USE [master]', []);
Conn.ExecSQL('ALTER DATABASE [bkdb] SET SINGLE_USER WITH ROLLBACK IMMEDIATE', []);
Conn.ExecSQL('USE [master]', []);
Conn.ExecSQL('DROP DATABASE bkdb', []);
end;
end;
end;

Vahid.Shatery
سه شنبه 31 خرداد 1390, 23:49 عصر
سلام
با اجازه جناب کشاورز .
فکر کنم اگه این کار را بدون منت انجام می دادین بهتر بود .
اگه شما این کد را قرار نمی دادین ، افراد دیگه ای هم بودن که این کار را انجام بدن .

a_mosavian
سه شنبه 07 تیر 1390, 23:40 عصر
سلام
با اجازه جناب کشاورز .
فکر کنم اگه این کار را بدون منت انجام می دادین بهتر بود .
اگه شما این کد را قرار نمی دادین ، افراد دیگه ای هم بودن که این کار را انجام بدن .
می خواستم روتین بکاپ گیری رو هم بذارم که پشیمونم کردید :دی