📄 backupthreadunit.pas
字号:
//*-----------------------------------------------------------------------------
//* 系统名称:数据自动备份系统
//* 作 者:陈春华
//* 开发时间:2005
//* Windows2000 Server + SQL Server2000 + Delphi7
//* 功能简介:
//* 软件可自动完成SQL Server数据库和文档的数据定时自动备份,
//* 由用户选择对哪些数据库或文档进行数据备份,提供对备份、还原
//* 数据作业的管理、分析、日志跟踪等功能,备份频率不受限制。
//*-----------------------------------------------------------------------------
unit BackupThreadUnit;
interface
uses
Classes, ADODB, SysUtils, Windows;
type
TBackupThread = class(TThread) //数据库备份线程
private
{ Private declarations }
serverName: String; //服务器名称
userName: String; //用户名
pswd: String; //密码
DBName: String; //数据库
path: String; //备份路径
backupFile:String; //整合了备份文件名的备份路径
remoteBackup:Boolean; //备份地址是否是远程标志
DBBackupFileSize:real; //备份量
procedure BackupDone; //备份执行过程
protected
procedure Execute; override;
public
constructor Create(_serverName, _userName, _pswd, _DBName,_path:String);
end;
implementation
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure TBackupThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
uses
SqlFunctionUnit, MainUnit;
{ TBackupThread }
constructor TBackupThread.Create(_serverName, _userName, _pswd, _DBName,_path:String);
begin
serverName:=_serverName;
userName:=_userName;
pswd:=_pswd;
DBName:=_DBName;
path:=_path;
DBBackupFileSize:=0;
backupFile:=path+'\'+ DBName+'.bak'; //整合备份目标
remoteBackup:=False;
if copy(path,1,2)='\\' then //远程目的地址判断
begin
backupFile :=ExtractFilePath(ParamStr(0))+'TempBackupFile\'+ DBName+'.bak';
remoteBackup:=True;
end;
inherited Create(True);
end;
procedure TBackupThread.BackupDone;
var
conn: TADOConnection;
query: TADOQuery;
sqlStr: String;
LogFile: Textfile;
isWrong: Boolean; //报错标志
beginTime, endTime: TDateTime; //备份起始时间
begin
try
isWrong:=False;
beginTime:=now;
AssignFile(LogFile,ExtractFilePath(ParamStr(0))+'\Log\DBBackupLog.log');
if fileExists(ExtractFilePath(ParamStr(0))+'\Log\DBBackupLog.log') then
Append(LogFile) //日志文件有则增加,无则创建
else
Rewrite(LogFile);
try
try
conn:=TADOConnection.Create(nil);
conn.LoginPrompt:=False;
ConnectToSqlServer(pswd,userName,serverName,DBName,conn);
//^ 连接数据库
query:=TADOQuery.Create(nil);
query.Connection:=conn;
sqlStr:='Backup Database '+'"'+DBName+'"'+' To Disk ='''+backupFile+'''';
ExecuteSQLPro(sqlStr,1,query);
//^ 数据库备份sql语句
DBBackupFileSize:=GetFileSize(backupFile);
if remoteBackup then //如果是远程地址,则从本地备份到远程目的地址
begin
try
try
CopyFile(PChar(backupFile),PChar(path+'\'+ DBName+'.bak'),False);
//^ 主传输
except
SendFile(backupFile,path+'\'+ DBName+'.bak');
//^ 辅传输
end;
finally
deletefile(PChar(backupFile));
end;
end;
except
isWrong:=True;
end;
finally
query.Close;
conn.Close;
query.Free;
conn.Free;
end;
finally
endTime:=now;
if isWrong then //报错处理
begin
writeln(LogFile,DateTimeToStr(beginTime)+' 数据库'+DBName+'备份失败。');
MainForm.StatusBar1.Panels[0].Text:='数据库'+DBName+'备份失败!'+DateTimeToStr(endTime);
end
else
begin
writeln(LogFile,DateTimeToStr(beginTime)+', 数据库'+DBName+'成功备份到'+path+'\'+ DBName+'.bak,耗时:'+TimeToStr(endTime-beginTime)+',备份量:'+FormatFloat('#,##0.00',DBBackupFileSize)+'MB');
MainForm.StatusBar1.Panels[0].Text:='数据库'+DBName+'备份成功!'+DateTimeToStr(endTime);
end;
CloseFile(LogFile);
end;
end;
procedure TBackupThread.Execute;
begin
{ Place thread code here }
FreeOnTerminate:=True;
synchronize(BackupDone);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -