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 + -
显示快捷键?