有个控件很不错的,以下是他的源码:
{*************************************************************}
{ 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.