如何备份数据库文件 (0分)

  • 主题发起人 主题发起人 xie_kx
  • 开始时间 开始时间
X

xie_kx

Unregistered / Unconfirmed
GUEST, unregistred user!
请教大侠:如何备份数据库文件,例如:copy *.db文件成一个新文件,且
能覆盖之.
谢谢!!
 
如果只是一些小型的桌面数据库,如pardox、dbase等,象你说的直接Copy就行了,如果
是大型数据库,ADO的组件有保持为文件、从文件中读入等功能,你看看帮助试试。
 
简易方法是:
copyfile(existingfilename:pchar,newfilename:pchar,failifexist:boolean)
existingfilename:是源文件路径
nwefilename:是新的文件路径
failifexist:如果存在是否覆盖
 
我做了一个备份程序,思路就是把所有的数据文件复制到另外一文件夹下就可以了。
如果要源程序我可以告诉你。
 
to pjprobbi:
您好!把您的源程序发给我好吗?我的Email:xie_kx@163.com
 
如果是SQL SERVER 就可以用BACKUP 命令
如果是ORACLE 就用EXPORT 就可以了
 
有个控件很不错的,以下是他的源码:
{*************************************************************}
{ KDBBackup component version 1.01 }
{ Copyright ?1998,99 Korzh company }
{ http://www.korzh.com/ }
{ mailto:info@korzh.com }
{-------------------------------------------------------------}
{ last updated: Jan-27-1999 }
{*************************************************************}
unit KDbBckp;

interface

uses SysUtils, Classes, Dialogs, Db, DbTables, BDE;

type

TKDBBackup = class(TComponent)
private
FDatabaseName : string;
FWorkDir : string;
FTable : TTable;
FEmptyTables : boolean;
procedure SetWorkDir(Value : string);
procedure SetDatabaseName(Value : string);
public

constructor Create(AOwner : TComponent); override;
destructor Destroy;override;


procedure ExportDatabase;
procedure ImportDatabase;
procedure ExportTable(ATblName : string);
procedure ImportTable(ATblName : string);
published
property EmptyTables : boolean read FEmptyTables write FEmptyTables default true;
property DatabaseName : string read FDatabaseName write SetDatabaseName;
property WorkDir : string read FWorkDir write SetWorkDir;
end;

procedure Register;

implementation
uses DsgnIntf;

procedure CreateTextTableByTable(ATable, ADestTable : TTable);
var
i : integer;
FldName : string;
FldType : TFieldType;
FldSize : word;
FldRequired : boolean;
begin
ADestTable.Close;
ADestTable.TableName := Copy(ATable.TableName, 1, Pos('.', ExtractFileName(ATable.TableName))-1)+'.txt';

ADestTable.TableType := ttASCII;
ADestTable.FieldDefs.Clear;
for i := 0 to ATable.FieldDefs.Count-1 do
begin
FldName := ATable.FieldDefs.Name;
FldType := ATable.FieldDefs.DataType;
FldSize := ATable.FieldDefs.Size;
FldRequired := ATable.FieldDefs.Required;
if not (FldType in [ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary])
then ADestTable.FieldDefs.Add(FldName, FldType,FldSize,FldRequired);

end;
// ADestTable.IndexDefs.Assign(ATable.IndexDefs);
ADestTable.CreateTable;
end;

constructor TKDBBackup.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
FTable := TTable.Create(nil);
FWorkDir := '';
FDatabaseName := '';
FEmptyTables := true;
end;

destructor TKDBBackup.Destroy;
begin
FTable.Free;
inherited Destroy;
end;

procedure TKDBBackup.SetDatabaseName(Value : string);
var
dbDes: DBDesc;
begin
FDatabaseName := Value;
//if not (csLoading in ComponentState) then
//begin
// Check(DbiGetDatabaseDesc(PChar(FDatabaseName), @dbDes));
// WorkDir := StrPas(dbDes.szPhyName) + '/TextBkup';
//end;
FTable.DatabaseName := FDatabaseName;
end;

procedure TKDBBackup.SetWorkDir(Value : string);
begin
FWorkDir := Value;
end;

const
BlobFields = [ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary];

procedure TKDBBackup.ExportTable(ATblName : string);
var
i : integer;
S : string;
slOut : TStrings;
MS1, MS2 : TMemoryStream;
begin
{$I-}
MkDir(FWorkDir);
if IOResult <> 0 then ;
{$I+}
slOut := TStringList.Create;
MS1 := TMemoryStream.Create;
MS2 := TMemoryStream.Create;
try
FTable.TableName := ATblName;
FTable.Active := true;
while not FTable.EOF do
begin
S := '';
for i := 0 to FTable.FieldCount - 1 do
begin
if not (FTable.Fields.DataType in BlobFields) then
S := S + FTable.Fields.AsString + #9
else begin
MS2.Clear;
(FTable.Fields as TBlobField).SaveToStream(MS2);
MS1.CopyFrom(MS2,0);
S := S + IntToStr(MS2.Size) + #9;
end;
end;
Delete(S,Length(S),1);
slOut.Add(S);
FTable.Next;
end;
FTable.Active := false;
slOut.SaveToFile(FWorkdir+'/'+ATblName+'.txt');
if MS1.Size > 0 then
MS1.SaveToFile(FWorkdir+'/'+ATblName+'.mem');
finally
slOut.Free;
MS2.Free;
MS1.Free;
end;
end;

procedure TKDBBackup.ExportDatabase;
var
slTbls : TStrings;
i : integer;
begin
slTbls := TStringList.Create;
try
Session.GetTableNames(FDatabaseName, '', false, false, slTbls);
for i := 0 to slTbls.Count-1 do
ExportTable(slTbls);
finally
slTbls.Free;
end;
end;

procedure TKDBBackup.ImportTable(ATblName : string);
var
i,j : integer;
FldVal,S : string;
slIn : TStrings;
slTemp : TStrings;
MS1, MS2 : TMemoryStream;
sz : integer;
function NextField(var S1 : string) : string;
var
p : integer;
begin
p := Pos(#9, S1);
if p = 0
then begin Result := S1;S1 := ''; end
else begin Result := Copy(S1,1,p-1);Delete(S1,1, p);end;
end;
begin
slIn := TStringList.Create;
MS1 := TMemoryStream.Create;
MS2 := TMemoryStream.Create;
try
slIn.LoadFromFile(FWorkDir+'/'+ATblName+'.txt');
if FileExists(FWorkDir+'/'+ATblName+'.mem') then
MS1.LoadFromFile(FWorkDir+'/'+ATblName+'.mem');
MS1.Position := 0;
FTable.TableName := ATblName;
if FEmptyTables then FTable.EmptyTable;
FTable.Active := true;
for i := 0 to slIn.Count-1 do
begin
FTable.Append;
S := slIn;
FldVal := NextField(S);
for j := 0 to FTable.FieldCount-1 do
begin
if not (FTable.Fields[j].DataType in BlobFields) then
begin
FTable.Fields[j].AsString := FldVal;
end
else begin
sz := StrToInt(FldVal);
if sz > 0 then
begin
MS2.CopyFrom(MS1,sz);
MS2.Position := 0;
(FTable.Fields[j] as TBlobField).LoadFromStream(MS2);
MS2.Clear;
end;
end;
FldVal := NextField(S);
end;
FTable.Post;
end;
FTable.Active := false;
finally
MS1.Free;
MS2.Free;
slIn.Free;
end;
end;

procedure TKDBBackup.ImportDatabase;
var
slTbls : TStrings;
i : integer;
begin
slTbls := TStringList.Create;
try
Session.GetTableNames(FDatabaseName, '', false, false, slTbls);
for i := 0 to slTbls.Count-1 do
ImportTable(slTbls);
finally
slTbls.Free;
end;
end;


{ TDBStringProperty }

type
TDBStringProperty = class(TStringProperty)
public
function GetAttributes: TPropertyAttributes; override;
procedure GetValueList(List: TStrings); virtual; abstract;
procedure GetValues(Proc: TGetStrProc); override;
end;

function TDBStringProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paValueList, paSortList, paMultiSelect];
end;

procedure TDBStringProperty.GetValues(Proc: TGetStrProc);
var
I: Integer;
Values: TStringList;
begin
Values := TStringList.Create;
try
GetValueList(Values);
for I := 0 to Values.Count - 1 do Proc(Values);
finally
Values.Free;
end;
end;

type
TDatabaseNameProperty = class(TDBStringProperty)
public
procedure GetValueList(List: TStrings); override;
end;

procedure TDatabaseNameProperty.GetValueList(List: TStrings);
begin
Session.GetDatabaseNames(List);
end;


procedure Register;
begin
RegisterComponents('Data Access', [TKDBBackup]);
// RegisterPropertyEditor(TypeInfo(string), TKDBBackup, 'DatabaseName', TDatabaseNameProperty);
end;

end.
 
to pjprobbi:
您好!把您的源程序发给我好吗?我的Email:ygzhy@163.net
 
后退
顶部