📄 dbconverter.pas
字号:
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 + -