📄 sysbackup.pas
字号:
//------------------------------------------------------------
// 作者:曾庆顺
// 模块:系统数据备份窗口
// 时间:2002.09.17
// 功能介绍:
//-----------------------------------------------------------
unit sysbackup;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, DBTables, Db, Buttons,FileCtrl;
type
TSysBackFrm = class(TForm)
Panel1: TPanel;
GroupBox1: TGroupBox;
RB_DB: TRadioButton;
RB_DBF: TRadioButton;
RB_TXT: TRadioButton;
Table1: TTable;
Table2: TTable;
BatchMove1: TBatchMove;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Label1: TLabel;
Label2: TLabel;
CB_Delete: TCheckBox;
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
FDir:string;
Function IsHaveDcid(pTable:TTable;pDcid:string):Boolean;
Function IsHaveBlob(pTable:TTable):Boolean;
Function ExecQuery(PQuery:TQuery;PSql:string):Boolean;
//得到数据库服务器日期
Function GetDbServerDate(DBName:string):string;overload;
public
{ Public declarations }
end;
var
SysBackFrm: TSysBackFrm;
implementation
{$R *.DFM}
uses xt_sjbf_frm_main;
procedure TSysBackFrm.BitBtn1Click(Sender: TObject);
var FTName:string;
fsql:string;
begin
xt_sjbf_main.qry_TB_XTGL_FACB.DisableControls;
if RB_TXT.Checked then
begin
xt_sjbf_main.qry_TB_XTGL_FACB.First;
while not xt_sjbf_main.qry_TB_XTGL_FACB.Eof do
begin
Table1.close;
Table1.TableName:=xt_sjbf_main.qry_TB_XTGL_FACB.fieldbyname('BYWM').asstring;
if IsHaveBlob(Table1) then
begin
if Application.MessageBox('要备份的表存在Blob或Memo字段,'+#13+' 不能'+
'用文本的方式备份,'+#13+' 否则该表将不做备份,'+#13+' 是否选择其他方'+
'式?','警告',MB_OKCANCEL+MB_ICONSTOP) =ID_OK then exit;
break;
end;
xt_sjbf_main.qry_TB_XTGL_FACB.Next;
end;
end;
//设置备份方式为拷贝
BatchMove1.Mode:=batCopy;
table2.DatabaseName:=FDir;
//计算要备份的表的个数
FSql:='select count(*) from T_XTGL_FACB where FABH ='''+xt_sjbf_main.Edit_fabh.Text+'''';
xt_sjbf_main.Query.close;
xt_sjbf_main.Query.sql.Clear;
if xt_sjbf_main.qry_TB_XTGL_FACB.Filtered then
fsql:=fsql+ ' and ('+ xt_sjbf_main.qry_TB_XTGL_FACB.Filter+')';
xt_sjbf_main.Query.sql.Add(fsql);
xt_sjbf_main.Query.open;
xt_sjbf_main.Query.First;
//正式开始备份
xt_sjbf_main.qry_TB_XTGL_FACB.First;
while not xt_sjbf_main.qry_TB_XTGL_FACB.Eof do
begin
FTName:=xt_sjbf_main.qry_TB_XTGL_FACB.fieldbyname('BYWM').asstring;
Table1.close;
Table1.TableName:=FTName;
table1.Filter:='';
table1.Filtered:=false;
//删除数据时用
fsql:='delete from '+FTName;
//if IsHaveDcid(Table1,'DCID') then
//begin
//table1.Filter:='DCID='''+FCurrentDcid+'''';
table1.Filtered:=true;
//如果有DCID 则删除数据时要过滤
fsql:='delete from ' + FTName ;
//end;
Label2.Caption:=xt_sjbf_main.qry_TB_XTGL_FACB.fieldbyname('BZWM').asstring;
self.update;
Table2.close;
if RB_DB.Checked then
begin
table2.TableName:=FTName+'.db';
table2.TableType:=ttParadox;
end
else if RB_DBF.Checked then
begin
table2.TableName:=FTName+'.dbf';
table2.TableType:=ttDBase;
end
else
begin
if IsHaveBlob(Table1) then
begin
xt_sjbf_main.qry_TB_XTGL_FACB.Next;
continue;
end;
table2.TableName:=FTName+'.txt';
table2.TableType:=ttASCII;
end;
try
if table1.Active then table1.Active:=false;
if table2.Active then table2.Active:=false;
BatchMove1.Execute;
except
xt_sjbf_main.qry_TB_XTGL_FACB.EnableControls;
Application.MessageBox('备份表数据失败!','警告',MB_OK+MB_ICONSTOP);
close;
exit;
end;
//如果选中则删除数据
if CB_Delete.Checked then
begin
ExecQuery(xt_sjbf_main.Query,fsql);
end;
xt_sjbf_main.qry_TB_XTGL_FACB.Next;
//
end;
xt_sjbf_main.qry_TB_XTGL_FACB.EnableControls;
Application.MessageBox('备份表数据成功!','警告',MB_OK+MB_ICONEXCLAMATION);
close;
end;
Function TSysBackFrm.IsHaveDcid(pTable:TTable;pDcid:string):Boolean;
var i:integer;
begin
result:=false;
if not pTable.Active then
try
pTable.Active:=true;
except
exit;
end;
for i:=0 to pTable.FieldCount - 1 do
begin
if pTable.Fields[i].FieldName = pDcid then
begin
result:=true;
break;
end;
end;
end;
Function TSysBackFrm.IsHaveBlob(pTable:TTable):Boolean;
var i:integer;
begin
result:=false;
if not pTable.Active then
try
pTable.Active:=true;
except
result:=true;
exit;
end;
for i:=0 to pTable.FieldCount - 1 do
begin
if (pTable.Fields[i].DataType=ftMemo) or (pTable.Fields[i].DataType=ftBlob) then
begin
result:=true;
break;
end;
end;
end;
procedure TSysBackFrm.FormCreate(Sender: TObject);
begin
//数据备份在当前目录下\data子目录
Label2.Caption:='';
FDir:=ExtractFilePath(ParamStr(0))+'data\'+GetDbServerDate('db_vipdl');
if not DirectoryExists(FDir) then ForceDirectories(FDir);
end;
function TSysBackFrm.ExecQuery(PQuery: TQuery; PSql: string): Boolean;
begin
Result:=true;
PQuery.close;
PQuery.sql.Clear;
PQuery.Filtered:=false;
PQuery.sql.add(PSql);
try
PQuery.ExecSQL;
except
Result:=false;
end;
end;
function TSysBackFrm.GetDbServerDate(DBName: string): string;
var query:TQuery;
Present: TDateTime;
Year, Month, Day: Word;
str:string;
begin
try
query:=TQuery.Create(nil);
except
exit;
end;
query.DatabaseName:=DBname;
query.close;
query.sql.Clear;
query.sql.Add('select distinct sysdate from dual');
try
query.open;
except
exit;
end;
query.First;
Present:=Query.Fields[0].AsDateTime;
DecodeDate(Present, Year, Month, Day);
str:=inttostr(year);
if month<10 then str:=str+'0'+inttostr(month)
else str:=str+inttostr(month);
if day<10 then str:=str+'0'+inttostr(day)
else str:=str+inttostr(day);
result:=str;
query.free;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -