tr_main.pas
来自「亚惠快餐管理信息系统 包括亚惠快餐管理的各项功能」· PAS 代码 · 共 376 行
PAS
376 行
unit TR_Main;
{
代码单元名称:通用库表恢复工具主窗口
从属软件:大连资金清算中心打码机管理信息系统
开发单位:大连理工大学计算机技术研究所软件工程研究室
作者:王树润
时间:2001,1,30
}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls, CheckLst, Buttons, ExtCtrls,db;
type
TTR_DfmMain = class(TForm)
PageControl1: TPageControl;
PriorButton: TButton;
NextButton: TButton;
Button3: TButton;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
TabSheet3: TTabSheet;
TabSheet4: TTabSheet;
Panel1: TPanel;
Panel2: TPanel;
Panel3: TPanel;
Panel4: TPanel;
ConfirmMemo: TMemo;
Panel5: TPanel;
Label1: TLabel;
Label2: TLabel;
DestinationDatabaseNameComboBox: TComboBox;
Label3: TLabel;
Label4: TLabel;
DestinationTableNameListBox: TListBox;
SourceDatabaseNameEdit: TEdit;
OpenFileSpeedButton: TSpeedButton;
SourceTableNameListBox: TListBox;
OpenDialog1: TOpenDialog;
CloseSpeedButton: TSpeedButton;
Image1: TImage;
Image2: TImage;
Animate1: TAnimate;
procedure FormShow(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure NextButtonClick(Sender: TObject);
procedure PriorButtonClick(Sender: TObject);
procedure OpenFileSpeedButtonClick(Sender: TObject);
procedure CloseSpeedButtonClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
MyServerName:string;
Function FieldTypeConvertion(SourceFieldType:TFieldType):string;
end;
procedure SetWork;
implementation
uses TR_DataModule1, Main;
{$R *.DFM}
procedure SetWork;
var
TR_DfmMain:TTR_DfmMain;
ServerName:string;
begin
ServerName:=MainForm.ServerName;
if not InputQuery('数据表恢复登录工具','请输入合法的数据库服务器名:',ServerName) then Exit;
if ServerName='' then Exit;
Screen.Cursor:=crHourGlass;
MainForm.Refresh;
Application.CreateForm(TTR_DfmMain,TR_DfmMain);
TR_DfmMain.MyServerName:=ServerName;
Screen.Cursor:=crDefault;
TR_DfmMain.ShowModal;
TR_DfmMain.Free;
end;
//窗体==========================================================================
procedure TTR_DfmMain.FormShow(Sender: TObject);
begin
Screen.Cursor:=crHourGlass;
Refresh;
TR_DfmDataModule1.DestinationDatabaseADOConnection.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=master;Data Source='+MyServerName;
with TR_DfmDataModule1.DestinationDatabaseADOQuery do
begin
Close;
Sql.Clear;
Sql.Add('Select * From SysDatabases');
try Open;
except
Screen.Cursor:=crDefault;
ShowMessage('系统数据库受到破坏,请与系统管理员联系!');
Exit;
end;
while not Eof do
begin
DestinationDatabaseNameComboBox.Items.Add(FieldByName('Name').AsString);
Next;
end;
end;
DestinationDatabaseNameComboBox.ItemIndex:=9;
PageControl1.ActivePageIndex:=0;
Screen.Cursor:=crDefault;
end;
procedure TTR_DfmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
TR_DfmDataModule1.SourceDatabaseADOQuery.Close;
TR_DfmDataModule1.DestinationDatabaseADOQuery.Close;
TR_DfmDataModule1.SourceDatabaseADOConnection.Close;
TR_DfmDataModule1.DestinationDatabaseADOConnection.Close;
end;
//关闭==========================================================================
procedure TTR_DfmMain.Button3Click(Sender: TObject);
begin
Close;
end;
//上一步按钮====================================================================
procedure TTR_DfmMain.PriorButtonClick(Sender: TObject);
begin
//转到目标数据表页======================
if PageControl1.ActivePageIndex=3 then
begin
PageControl1.ActivePageIndex:=2;
ConfirmMemo.Clear;
NextButton.Caption:='下一步>>';
Exit;
end;
//转到源数据表页======================
if PageControl1.ActivePageIndex=2 then
begin
PageControl1.ActivePageIndex:=1;
DestinationTableNameListBox.Items.Clear;
Exit;
end;
//转到介绍页======================
if PageControl1.ActivePageIndex=1 then
begin
PageControl1.ActivePageIndex:=0;
SourceDatabaseNameEdit.Clear;
SourceTableNameListBox.Items.Clear;
OpenFileSpeedButton.Enabled:=True;
Exit;
end;
//无转接页========================
if PageControl1.ActivePageIndex=0 then
Exit;
end;
//下一步按钮事件================================================================
procedure TTR_DfmMain.NextButtonClick(Sender: TObject);
var
i,j,k:integer;
SourceFieldName:string;
SourceFieldType:TFieldType;
SourceFieldSize:integer;
DestinationFieldTypeString:string;
CreateTableString:string;
begin
//转到源数据表页===================
if PageControl1.ActivePageIndex=0 then
begin
PageControl1.ActivePageIndex:=1;
Exit;
end;
//转到目标数据表页=================
if PageControl1.ActivePageIndex=1 then
begin
DestinationTableNameListBox.Items.Clear;
if SourceTableNameListBox.Items.Count=0 then Exit;
for i:=0 to SourceTableNameListBox.Items.Count-1 do
begin
if Pos('_',SourceTableNameListBox.Items[i])<>0 then
DestinationTableNameListBox.Items.Add(Copy(SourceTableNameListBox.Items[i],Pos('_',SourceTableNameListBox.Items[i])+1,Pos('.',SourceTableNameListBox.Items[i])-Pos('_',SourceTableNameListBox.Items[i])-1))
else
DestinationTableNameListBox.Items.Add(Copy(SourceTableNameListBox.Items[i],1,Pos('.',SourceTableNameListBox.Items[i])-1));
end;
PageControl1.ActivePageIndex:=2;
Exit;
end;
//转到确认页======================
if PageControl1.ActivePageIndex=2 then
begin
if ((DestinationDatabaseNameComboBox.Text='') or (DestinationTableNameListBox.Items.Count=0)) then Exit;
PageControl1.ActivePageIndex:=3;
NextButton.Caption:='开始恢复';
ConfirmMemo.Lines.Add('源数据库:');
ConfirmMemo.Lines.Add(SourceDatabaseNameEdit.Text);
ConfirmMemo.Lines.Add('');
ConfirmMemo.Lines.Add('目标数据库:');
ConfirmMemo.Lines.Add(DestinationDatabaseNameComboBox.Text);
ConfirmMemo.Lines.Add('');
ConfirmMemo.Lines.Add('数据表:');
for i:=0 to DestinationTableNameListBox.Items.Count-1 do
ConfirmMemo.Lines.Add(SourceTableNameListBox.Items[i]+'->'+DestinationTableNameListBox.Items[i]);
Exit;
end;
//确定事件========================
if PageControl1.ActivePageIndex=3 then
begin
if MessageDlg('数据表恢复会破坏原来库中的结构信息,请确认!',mtConfirmation,[mbYes, mbNo], 0) = mrNo then Exit;
Animate1.Visible:=True;
Animate1.Active:=True;
TR_DfmDataModule1.SourceDatabaseADOConnection.Close;
TR_DfmDataModule1.SourceDatabaseADOConnection.ConnectionString:='Provider=MSDASQL.1;Persist Security Info=False;Data Source=dBASE Files;Initial Catalog='+SourceDatabaseNameEdit.Text;
TR_DfmDataModule1.DestinationDatabaseADOConnection.Close;
TR_DfmDataModule1.DestinationDatabaseADOConnection.ConnectionString:='Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog='+DestinationDatabaseNameComboBox.Text+';Data Source='+MyServerName;
//循环处理多个库表==========================================================
for i:=0 to SourceTableNameListBox.Items.Count-1 do
begin
//从源表中读结构信息====================================================
with TR_DfmDataModule1.SourceDatabaseADOQuery do
begin
Close;
Sql.Clear;
Sql.Add('Select * From '+Copy(SourceTableNameListBox.Items[i],1,Pos('.',SourceTableNameListBox.Items[i])-1));
try Open;
except
ShowMessage('error');
Animate1.Active:=False;
Animate1.Visible:=False;
Exit;
end;
end;
for j:=0 to TR_DfmDataModule1.SourceDatabaseADOQuery.FieldCount-1 do
begin
SourceFieldName:=TR_DfmDataModule1.SourceDatabaseADOQuery.Fields[j].FieldName;
SourceFieldType:=TR_DfmDataModule1.SourceDatabaseADOQuery.Fields[j].DataType;
DestinationFieldTypeString:=FieldTypeConvertion(SourceFieldType);
SourceFieldSize:=TR_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='text') or (DestinationFieldTypeString='bit') or (DestinationFieldTypeString='datetime')) then
CreateTableString:=SourceFieldName+' '+DestinationFieldTypeString
else
CreateTableString:=SourceFieldName+' '+DestinationFieldTypeString+'('+IntToStr(SourceFieldSize)+')'
end
else
begin
if ((DestinationFieldTypeString='text') or (DestinationFieldTypeString='bit') or (DestinationFieldTypeString='datetime')) then
CreateTableString:=CreateTableString+','+SourceFieldName+' '+DestinationFieldTypeString
else
CreateTableString:=CreateTableString+','+SourceFieldName+' '+DestinationFieldTypeString+'('+IntToStr(SourceFieldSize)+')';
end;
end;
//创建目标表============================================================
with TR_DfmDataModule1.DestinationDatabaseADOQuery do
begin
Close;
Sql.Clear;
Sql.Add('IF EXISTS (SELECT name FROM sysobjects WHERE name = '''+DestinationTableNameListBox.Items[i]+''' AND type = ''U'') DROP Table '+DestinationTableNameListBox.Items[i]);
try ExecSQL;
except
ShowMessage('error');
Animate1.Active:=False;
Animate1.Visible:=False;
Exit;
end;
Sql.Clear;
Sql.Add('create table '+DestinationTableNameListBox.Items[i]);
Sql.Add('('+CreateTableString+')');
try ExecSQL;
except
ShowMessage('error');
Animate1.Active:=False;
Animate1.Visible:=False;
Exit;
end;
Sql.Clear;
Sql.Add('Select * From '+DestinationTableNameListBox.Items[i]);
try Open;
except
ShowMessage('error');
Animate1.Active:=False;
Animate1.Visible:=False;
Exit;
end;
end;
//从源表读数据信息向目标表中写数据信息==================================
TR_DfmDataModule1.SourceDatabaseADOQuery.First;
TR_DfmDataModule1.DestinationDatabaseADOQuery.First;
while not TR_DfmDataModule1.SourceDatabaseADOQuery.Eof do
begin
TR_DfmDataModule1.DestinationDatabaseADOQuery.Insert;
for k:=0 to TR_DfmDataModule1.SourceDatabaseADOQuery.FieldCount-1 do
begin
try
TR_DfmDataModule1.DestinationDatabaseADOQuery.Fields[k].AsString:=TR_DfmDataModule1.SourceDatabaseADOQuery.Fields[k].AsString;
except
ShowMessage('error');
Animate1.Active:=False;
Animate1.Visible:=False;
Exit;
end;
end;
TR_DfmDataModule1.DestinationDatabaseADOQuery.Post;
TR_DfmDataModule1.SourceDatabaseADOQuery.Next;
end;
end;
Animate1.Active:=False;
Animate1.Visible:=False;
ShowMessage('恢复完成!');
Close;
end;
end;
//从dbase转为sqlserver形式的数据类型============================================
function TTR_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:='text'
{else if SourceFieldType in [ftBoolean] then
DestinationFieldTypeString:='bit'
else if SourceFieldType in [ftFloat] then
DestinationFieldTypeString:='float'
else if SourceFieldType in [ftDate] then
DestinationFieldTypeString:='datetime'
else}
else
DestinationFieldTypeString:='char';
Result:=DestinationFieldTypeString;
end;
//打开源数据表==================================================================
procedure TTR_DfmMain.OpenFileSpeedButtonClick(Sender: TObject);
var
i:integer;
FilePath:string;
FileNames:TStrings;
begin
FileNames:=TStringList.Create;
if OpenDialog1.Execute then
begin
FilePath:=ExtractFilePath(OpenDialog1.Files[0]);
SourceDatabaseNameEdit.Text:=FilePath;
for i:=0 to OpenDialog1.Files.Count-1 do
begin
FileNames.Add(ExtractFileName(OpenDialog1.Files[i]));
SourceTableNameListBox.Items.Add(FileNames[i]);
end;
OpenFileSpeedButton.Enabled:=False;
end;
FileNames.Free;
end;
//清空源数据表==================================================================
procedure TTR_DfmMain.CloseSpeedButtonClick(Sender: TObject);
begin
SourceDatabaseNameEdit.Clear;
SourceTableNameListBox.Items.Clear;
OpenFileSpeedButton.Enabled:=True;
end;
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?