📄 tb_main.pas
字号:
DestinationTableNameListBox.Items.Add(SourceDatabaseNameComboBox.Text+'_'+SourceTablenames[i]+'.dbf');
end;
if DestinationTableNameListBox.Items.Count=0 then Exit;
PageControl1.ActivePageIndex:=2;
Exit;
end;
//转到确认页======================
if PageControl1.ActivePageIndex=2 then
begin
if ((DestinationDatabaseNameEdit.Text='') or (DestinationTableNameListBox.Items.Count=0)) then Exit;
PageControl1.ActivePageIndex:=3;
NextButton.Caption:='开始备份';
ConfirmMemo.Lines.Add('源数据库:');
ConfirmMemo.Lines.Add(SourceDatabaseNameComboBox.Text);
ConfirmMemo.Lines.Add('');
ConfirmMemo.Lines.Add('保存目录:');
ConfirmMemo.Lines.Add(DestinationDatabaseNameEdit.Text);
ConfirmMemo.Lines.Add('');
ConfirmMemo.Lines.Add('数据表:');
for i:=0 to DestinationTableNameListBox.Items.Count-1 do
ConfirmMemo.Lines.Add(Copy(DestinationTableNameListBox.Items[i],Pos('_',DestinationTableNameListBox.Items[i])+1,Pos('.',DestinationTableNameListBox.Items[i])-Pos('_',DestinationTableNameListBox.Items[i])-1)+'->'+DestinationTableNameListBox.Items[i]);
Exit;
end;
//确定事件========================
if PageControl1.ActivePageIndex=3 then
begin
Animate1.Visible:=True;
Animate1.Active:=True;
TB_DfmDataModule1.DestinationDatabaseADOConnection.Close;
TB_DfmDataModule1.DestinationDatabaseADOConnection.ConnectionString:='Provider=MSDASQL.1;Persist Security Info=False;User ID=sa;Data Source=dBASE Files;Initial Catalog='+DestinationDatabaseNameEdit.Text;
//循环处理多个库表==========================================================
for i:=0 to SourceTableNameCheckListBox.Items.Count-1 do
begin
if SourceTableNameCheckListBox.Checked[i] then
begin
//从源表中读结构信息====================================================
with TB_DfmDataModule1.SourceDatabaseADOQuery do
begin
Close;
Sql.Clear;
Sql.Add('Select * From '+SourceTablenames[i]);
try Open;
except
ShowMessage('error');
Animate1.Active:=False;
Animate1.Visible:=False;
Exit;
end;
end;
for j:=0 to TB_DfmDataModule1.SourceDatabaseADOQuery.FieldCount-1 do
begin
SourceFieldName:=TB_DfmDataModule1.SourceDatabaseADOQuery.Fields[j].FieldName;
SourceFieldType:=TB_DfmDataModule1.SourceDatabaseADOQuery.Fields[j].DataType;
DestinationFieldTypeString:=FieldTypeConvertion(SourceFieldType);
SourceFieldSize:=TB_DfmDataModule1.SourceDatabaseADOQuery.Fields[j].Size;
if SourceFieldSize=0 then
begin
if SourceFieldType in [ftDateTime] then
SourceFieldSize:=20
else SourceFieldSize:=10;
end;
if j=0 then
begin
if ((DestinationFieldTypeString='memo') or (DestinationFieldTypeString='logical') or (DestinationFieldTypeString='date')) then
CreateTableString:=SourceFieldName+' '+DestinationFieldTypeString
else
CreateTableString:=SourceFieldName+' '+DestinationFieldTypeString+'('+IntToStr(SourceFieldSize)+')'
end
else
begin
if ((DestinationFieldTypeString='memo') or (DestinationFieldTypeString='logical') or (DestinationFieldTypeString='date')) then
CreateTableString:=CreateTableString+','+SourceFieldName+' '+DestinationFieldTypeString
else
CreateTableString:=CreateTableString+','+SourceFieldName+' '+DestinationFieldTypeString+'('+IntToStr(SourceFieldSize)+')';
end;
end;
//创建目标表============================================================
//删除存在的目标表======================================================
with TB_DfmDataModule1.DestinationDatabaseADOQuery do
begin
Close;
if FileExists(DestinationDatabaseNameEdit.Text+'\'+SourceDatabaseNameComboBox.Text+'_'+SourceTablenames[i]+'.dbf') then
begin
Sql.Clear;
Sql.Add('drop table '+SourceDatabaseNameComboBox.Text+'_'+SourceTablenames[i]);
try ExecSQL;
except
ShowMessage('error');
Animate1.Active:=False;
Animate1.Visible:=False;
Exit;
end;
end;
end;
//拷贝建好的表作为目标表================================================
CopyFilePath:=ExtractFilePath(Application.ExeName);
CopyFilePath:=Copy(CopyFilePath,1,Pos('\bin\',LowerCase(CopyFilePath)))+'Tables\';
if (Pos('\bin\',LowerCase(ExtractFilePath(Application.ExeName)))<>0) and (FileExists(CopyFilePath+SourceDatabaseNameComboBox.Text+'_'+SourceTablenames[i]+'.dbf')) then
begin
CopySourceFileName:=CopyFilePath+SourceDatabaseNameComboBox.Text+'_'+SourceTablenames[i]+'.dbf';
CopyDestinationFileName:=DestinationDatabaseNameEdit.Text+'\'+SourceDatabaseNameComboBox.Text+'_'+SourceTablenames[i]+'.dbf';
if not CopyFile(Pchar(CopySourceFileName),Pchar(CopyDestinationFileName),False) then
ShowMessage('拷贝文件不成功,有的库表不能创建!');
if (Pos('\bin\',LowerCase(ExtractFilePath(Application.ExeName)))<>0) and (FileExists(CopyFilePath+SourceDatabaseNameComboBox.Text+'_'+SourceTablenames[i]+'.dbt')) then
begin
CopySourceFileName:=CopyFilePath+SourceDatabaseNameComboBox.Text+'_'+SourceTablenames[i]+'.dbt';
CopyDestinationFileName:=DestinationDatabaseNameEdit.Text+'\'+SourceDatabaseNameComboBox.Text+'_'+SourceTablenames[i]+'.dbt';
if not CopyFile(Pchar(CopySourceFileName),Pchar(CopyDestinationFileName),False) then
ShowMessage('拷贝文件不成功,有的库表不能创建!');
end
end
else
begin
//创建目标表============================================================
with TB_DfmDataModule1.DestinationDatabaseADOQuery do
begin
Close;
Sql.Clear;
Sql.Add('create table '+SourceDatabaseNameComboBox.Text+'_'+SourceTablenames[i]);
Sql.Add('('+CreateTableString+')');
//ShowMessage(sql.text);
try ExecSQL;
except
ShowMessage('error');
Animate1.Active:=False;
Animate1.Visible:=False;
Exit;
end;
end;
end;
//打开目标表============================================================
with TB_DfmDataModule1.DestinationDatabaseADOQuery do
begin
Close;
Sql.Clear;
Sql.Add('Select * From '+SourceDatabaseNameComboBox.Text+'_'+SourceTablenames[i]);
try Open;
except
ShowMessage('error');
Animate1.Active:=False;
Animate1.Visible:=False;
Exit;
end;
end;
//从源表读数据信息向目标表中写数据信息==================================
TB_DfmDataModule1.SourceDatabaseADOQuery.First;
TB_DfmDataModule1.DestinationDatabaseADOQuery.First;
while not TB_DfmDataModule1.SourceDatabaseADOQuery.Eof do
begin
TB_DfmDataModule1.DestinationDatabaseADOQuery.Insert;
for k:=0 to TB_DfmDataModule1.SourceDatabaseADOQuery.FieldCount-1 do
begin
try
TB_DfmDataModule1.DestinationDatabaseADOQuery.Fields[k].AsString:=TB_DfmDataModule1.SourceDatabaseADOQuery.Fields[k].AsString;
except
ShowMessage('error');
Animate1.Active:=False;
Animate1.Visible:=False;
Exit;
end;
end;
TB_DfmDataModule1.DestinationDatabaseADOQuery.Post;
TB_DfmDataModule1.SourceDatabaseADOQuery.Next;
end;
end;
end;
Animate1.Active:=False;
Animate1.Visible:=False;
ShowMessage('备份完成!');
SourceTablenames.Free;
Close;
end;
end;
//从sqlserver转为dbase形式的数据类型============================================
function TTB_DfmMain.FieldTypeConvertion(SourceFieldType:TFieldType): string;
var
DestinationFieldTypeString:string;
begin
// if SourceFieldType in [ftUnknown, ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftBytes, ftVarBytes, ftAutoInc, ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary, ftCursor, ftFixedChar, ftWideString, ftLargeint, ftADT, ftArray, ftReference, ftDataSet, ftOraBlob, ftOraClob, ftVariant, ftInterface, ftIDispatch, ftGuid] then
if SourceFieldType in [ftMemo] then
DestinationFieldTypeString:='memo'
{else if SourceFieldType in [ftBoolean] then
DestinationFieldTypeString:='logical'
else if SourceFieldType in [ftFloat] then
DestinationFieldTypeString:='float'
else if SourceFieldType in [ftDate] then
DestinationFieldTypeString:='date'}
else
DestinationFieldTypeString:='char';
Result:=DestinationFieldTypeString;
end;
//显示中文表名================================================================
procedure TTB_DfmMain.ShowSourceTablenames;
var
SourceTablenames:TStrings;
i:integer;
MidalTableNameString:string;
begin
SourceTablenames:=TStringList.Create;
TB_DfmDataModule1.SourceDatabaseADOConnection.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog='+SourceDatabaseNameComboBox.Text+';Data Source='+MyServerName;
TB_DfmDataModule1.SourceDatabaseADOConnection.GetTableNames(SourceTablenames,False);
if SourceTablenames.IndexOf('TTableName')<>-1 then
begin
for i:=0 to SourceTablenames.Count-1 do
begin
if (Copy(SourceTablenames[i],1,1)='T') or (Copy(SourceTablenames[i],1,1)='D') then
begin
MidalTableNameString:=LowerCase(Trim(Copy(SourceTablenames[i],2,50)));
with TB_DfmDataModule1.ChineseTableNameADOQuery do
begin
Close;
Sql.Clear;
Sql.Add('Select * From TTableName');
try Open;
except
ShowMessage('error');
Exit;
end;
end;
TB_DfmDataModule1.ChineseTableNameADOQuery.First;
while not TB_DfmDataModule1.ChineseTableNameADOQuery.Eof do
begin
if LowerCase(Trim(TB_DfmDataModule1.ChineseTableNameADOQuery.FieldByName('FieldNameE').AsString))=MidalTableNameString then
SourceTablenames[i]:=SourceTablenames[i]+'('+Trim(TB_DfmDataModule1.ChineseTableNameADOQuery.FieldByName('FieldNameC').AsString)+')';
TB_DfmDataModule1.ChineseTableNameADOQuery.Next;
end;
end;
end;
end;
SourceTableNameCheckListBox.Items.Assign(SourceTablenames);
SourceTablenames.Free;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -