⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbconverter.pas

📁 不同数据库的转换 用delphi实现access excel sql server 等数据库的转换
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit DBConverter;
{
本类完成将源数据库中的表及记录转换到目标数据库中的表中
说明:目标库中的目标表不能已存在,否则执行出错,本类将自动删除目标表

使用方法:
首先Create  --设置数据库--设置库中要转换的表  --Execute

确保源、目标库均未被其他程序独占式的打开。

根据源数据库类型,设置SourceDatabaseInfoPara属性
根据目标数据库类型,设置TargetDatabaseInfoPara属性
----当转换Access时,再设置 AccessPara
----当转换paradox时,再设置 paradoxPara
----当转换Foxpro时,再设置 dbfPara
----当转换sqlserver时,再设置 sqlserverPara

根据要转换的表信息,设置ConvertTablePara属性

然后执行Execute 检查返回值即可

不处理以下情况:
Excel--->Excel

DBF--->DBF //均为单表结构,没必要转换
Paradox--->Paradox

------------------------------------------------
所有数据库---->Excel
Excel---->所有数据库

Access/Paradox/DBF--->SqlServer
SqlServer---->SqlServer

Access,Paradox,Foxpro,SqlServer互传时连接低级数据库,传至高级数据库
Excel连接到其他数据库,来操作Excel

本类实现部分 Sqlserver与其他三种数据库不同,即执行SQL所连接的数据库不同

数据导入时要求:dbf,paradox的表未被其他程序打开,否则出错

}
interface
uses
  ADODB, DB, Classes, SysUtils;   //, csIntf
const
  conStrLength = 254;

  //连接各数据库的字符串
  //替换字符串说明:d%数据库来源:Access是文件路径,paradox是DSN,foxpro是目录,Sqlserver是数据库名
  //                u%用户名,登录数据库的用户名
  //                p%密码,登录数据库的密码
  //                s%数据源:仅用于SqlServer,Oracle是数据库服务器IP或服务器名
  //                t%是目标表名
  //                r%是源表名
  conSqlServerConnectStr = 'Provider=SQLOLEDB.1;Persist Security Info=False;User ID=u%;Password=p%;Initial Catalog=d%;Data Source=s%';
  //conOracleConnectStr = '';
  conAccessConnectStr = 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source=d%;Jet OLEDB:Database Password=p%';
  conParadoxConnectStr = 'Provider=MSDASQL.1;Persist Sedurity Info=false;Data Source=d%';
  conFoxproConnectStr = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d%;Extended Properties="dBase 5.0;";Persist Security Info=False';
  conExcelConnectStr = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d%;Extended Properties=excel 8.0;Persist Security Info=False';


  //作为目标库的连接字符串
  conSqlServerODBCStr = ' IN [ODBC] [ODBC;Driver=SQL Server;UID=u%;PWD=p%;Server=s%;DataBase=d%;]';
  //conOracleODBCStr = ' IN [ODBC] [ODBC;Driver={Microsoft ODBC for Oracle};UID=u%;PWD=p%;SERVER=s%;]';

type
  //用于测试是否为本类支持转换的源与目标数据库组合
  TItemIndexInt = 1..55;
  TAvailalbeDBConvert = set of TItemIndexInt;

{
//各数据库类型的数字标记
MS Access(*.mdb)              0
Excel(*.xls)                    1
Paradox DB(*.db)                 2
Foxpro or dBase File(*.dbf)       3
SQL Server                         4
Oracle                             5
}

  TDBType = (dbAccess, dbExcel, dbParadox, dbFoxpro, dbSqlServer, dbOracle);

  TAccessPara = record
    Path: string[conStrLength]; //为mdb文件的全路径含文件名
    Password: string[conStrLength]; //Access数据库文件密码
  end;
  TExcelPara = record
    Path: string[conStrLength]; //Excel文件的全路径含文件名
  end;
  TFoxproPara = record
    Path: string[conStrLength]; //*.dbf数据库文件所在目录名
  end;
  TParadoxPara = record
    DSN: string[conStrLength]; //为ODBC中的DSN名
    Path: string[conStrLength]; //*.db数据库文件所在的目录名
  end;
  TSqlServerPara = record
    Server: string[conStrLength]; //数据库服务器的IP或机器名
    DBName: string[conStrLength]; //数据库文件名
    UserName: string[conStrLength]; //登录数据库的用户名
    Password: string[conStrLength]; //登录数据库的密码
  end;

  //设置本类的源、目标数据库详细信息的结构类型
  TDatabaseInfoPara = record
    DBType: TDBType; //标记数据库类型
    AccessPara: TAccessPara; //Access数据库参数
    ExcelPara: TExcelPara;
    FoxproPara: TFoxproPara;
    ParadoxPara: TParadoxPara;
    SqlServerPara: TSqlServerPara;
    //OraclePara: TOraclePara;
  end;

  //设置本类要转换的源表及目标表的详细信息的结构类型
  TConvertTablePara = record
    SourceTable: string[conStrLength]; //源库表名
    TargetTable: string[conStrLength]; //目标库表名
  end;

  //////////////////////////////////////////////////////////////////////////////
  TDBConverter = class
  private
    FconADO: TADOConnection; //用来连接目标数据库的ADO连接

    FConnectString: string; //ADO的连接字符串,根据库不同,连接不同的源或目标数据库
    FConnectTargetString: string; //执行数据转换时连接到目标数据库的连接字符串,与FConnectString可能相同也可能不同
    FExecuteSQLString: string; //ADO连接要执行的SQL命令文本

    FSourceDBPara: TDatabaseInfoPara; //记录源数据库信息
    FTargetDBPara: TDatabaseInfoPara; //记录目标数据库信息
    FConvertTablePara: TConvertTablePara; //记录源表及目标表名称

    AvailalbeDBConvert: TAvailalbeDBConvert;

    //下面各函数根据连接数据库的类型不同,生成各自的连接字符串
    function ReplaceAccessConnectStr(AccessPara: TAccessPara): string;
    function ReplaceExcelConnectStr(ExcelPara: TExcelPara): string;
    function ReplaceFoxproConnectStr(FoxproPara: TFoxproPara): string;
    function ReplaceParadoxConnectStr(ParadoxPara: TParadoxPara): string;
    function ReplaceSqlServerConnectStr(SqlServerPara: TSqlServerPara): string;
    function ReplaceSqlServerODBCStr(SqlServerPara: TSqlServerPara): string;


    //下面各函数执行相应的数据库转换的控制工作
    procedure ConvertAccess;
    procedure ConvertExcel;
    procedure ConvertFoxpro;
    procedure ConvertParadox;
    procedure ConvertSqlServer;
    //procedure ConvertOracle;

    //下面各函数完成执行转换的底层操作
    procedure StartConvert;
    procedure DropTargetTable; //检查目标数据库是否存在该目标表,是则删除它

  public
    constructor Create;
    //destructor Destroy;

    procedure Execute;
    //检查源与目标数据库的转换在本类中是否支持,参数为源目标库类型的相应数字标记,标记定义见Type段
    function CheckConvertAvailable(SourceDBIndex, TargetDBIndex: integer): Boolean;

  published
    property SourceDatabaseInfoPara: TDatabaseInfoPara read FSourceDBPara write FSourceDBPara; //源库类型及信息
    property TargetDatabaseInfoPara: TDatabaseInfoPara read FTargetDBPara write FTargetDBPara; //目标库类型及信息
    property ConvertTablePara: TConvertTablePara read FConvertTablePara write FConvertTablePara; //源表及目标表名称
  end;

implementation


{ TDBConverter }

constructor TDBConverter.Create;
begin
  inherited;
  //初始化本类支持转换的源与目标数据库类型,说明例:14 即 Excel -> Sql Server
  AvailalbeDBConvert := [0, 1, 2, 3, 4, 10, 12, 13, 14, 20, 21, 24, 30, 31,
    34, 40, 41, 42, 43, 44];
end;

//功能:
//根据ADO的连接字符串FConnectString,执行数据转换的SQL语句FExecuteSQLString
//执行转换操作,要求目标表不存在,因此本类将执行删除目标表操作

procedure TDBConverter.StartConvert;
begin

  //根据目标库类型,删除其目标表,Excel不需执行此操作
  case FTargetDBPara.DBType of
    dbAccess, dbFoxpro, dbParadox, dbSqlServer: //, dbOracle
      DropTargetTable;
  end;

  FconADO := TADOConnection.Create(nil);
  FconADO.ConnectionString := FConnectString;

  FconAdo.Open;
  FconAdo.Execute(FExecuteSQLString);

  FconAdo.Close;
  FconAdo.Free;
end;

//------------------------OK--------------------------------------

procedure TDBConverter.DropTargetTable;
var
  tbllist: TStringList;
  tgconADO: TADOConnection;
  S: string;
begin
  tgconADO := TADOConnection.Create(nil);
  tgconADO.ConnectionString := FConnectTargetString; //连接目标数据库串

  tgconAdo.Open;
  tbllist := TStringList.Create;
  tbllist.CaseSensitive := false;

  tgconADO.GetTableNames(tblList); //获取目标库中的表名列表

    //如目标表存在,则删除它
  if tbllist.IndexOf(FConvertTablePara.TargetTable) <> -1 then
  begin
    S := 'Drop Table [' + FConvertTablePara.TargetTable+']';
    tgconADO.Execute(S);
  end;

  tbllist.Free;

  tgconAdo.Close;
  tgconADO.Free;

end;

//功能:根据输入参数生成:
//ADO的连接字符串FConnectString,执行数据转换的SQL语句FExecuteSQLString

procedure TDBConverter.Execute;
begin
  case FSourceDBPara.DBType of
    dbAccess:ConvertAccess;
    dbExcel: ConvertExcel;
    dbFoxpro:ConvertFoxpro;
    dbParadox:ConvertParadox;
    dbSqlServer: ConvertSqlServer;
    //dbOracle: ConvertOracle;
  end;
end;

// 源数据库为Access

procedure TDBConverter.ConvertAccess;
var
  S: string;
begin
  case FTargetDBPara.DBType of
    dbAccess: begin //Access-->Access        --------------------->测试通过
       //连接到源Access
        FConnectString := ReplaceAccessConnectStr(FSourceDBPara.AccessPara);
        FConnectTargetString := ReplaceAccessConnectStr(FTargetDBPara.AccessPara);

        FExecuteSQLString := 'Select * into [;Database=' + FTargetDBPara.AccessPara.Path;
        FExecuteSQLString := FExecuteSQLString + '].' + FConvertTablePara.TargetTable;
        FExecuteSQLString := FExecuteSQLString + ' from ' + FConvertTablePara.SourceTable;

      end;
    dbExcel: begin //Access-->Excel     ----------->测试通过
        //连接到源Access
        FConnectString := ReplaceAccessConnectStr(FSourceDBPara.AccessPara);
        //目标Excel不使用FConnectTargetString

        FExecuteSQLString := 'Select * into [Excel 8.0;database=' + FTargetDBPara.ExcelPara.Path;
        FExecuteSQLString := FExecuteSQLString + '].' + FConvertTablePara.TargetTable;
        FExecuteSQLString := FExecuteSQLString + ' From ' + FConvertTablePara.SourceTable;
      end;
    dbFoxpro: begin //Access-->Foxpro    ------------------->测试通过

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -