Sybase数据库: function RegOdbcSybase(OdbcName:string;Desc:string;ServerName:string;DatabaseName:string;UserName:string;Password:string;var ErrorInfo:string):Boolean; var registertemp:TRegistry; //注册表类 begin if trim(OdbcName)='' then begin ErrorInfo:='ODBC数据源名称不能为空!'; RegOdbcSybase:=false; exit; end; if trim(DatabaseName)='' then begin ErrorInfo:='数据库名称不能为空!'; RegOdbcSybase:=false; exit; end; if trim(ServerName)='' then begin ErrorInfo:='Sybase客户端服务名称不能为空!'; RegOdbcSybase:=false; exit; end; //以下为注册ODBC(Sybase) 和写信息到注册表 registertemp:=Tregistry.Create; with registertemp do begin Rootkey:=HKEY_LOCAL_MACHINE; try try //注册Sybase closekey; if openkey('SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources',true) then writestring(OdbcName,'Sybase System 11'); closekey; If Openkey('SOFTWARE\ODBC\ODBC.INI\'+OdbcName,true) then begin Writestring('ApplicationName',''); Writestring('ApplicationUsingThreads','1'); Writestring('ArraySize','50'); Writestring('Charset',''); Writestring('CursorCacheSize','1'); Writestring('Database',DatabaseName); Writestring('Databases',DatabaseName); Writestring('Description',Desc); Writestring('DirectoryServiceProvider',''); Writestring('Driver','\SYSYBNT.DLL'); Writestring('EnableQuotedIdentifiers','0'); Writestring('InitializationString',''); Writestring('InterfacesFile',''); Writestring('Language',''); Writestring('LogonID',''); Writestring('OptimizePrepare','2'); Writestring('PacketSize','0'); Writestring('PasswordEncryption','0'); Writestring('SecurityServiceProvider',''); Writestring('SelectMethod','1'); Writestring('ServerName',ServerName); Writestring('Servers',ServerName); Writestring('WorkStationID',''); Writestring('UserName',UserName); Writestring('Password',Password); End; ErrorInfo:='创建成功!'; RegOdbcSybase:=true; except ErrorInfo:='创建失败,写注册表失败!'; RegOdbcSybase:=false; end; finally Closekey; Free; end; end; end;ACCESS数据库: //注册Access ODBC数据库连接信息到注册表 function RegOdbcAccess(OdbcName:string;Desc:string;DatabasePath:string;DatabaseUserName:string;DatabasePassword:string;var ErrorInfo:string):Boolean; var registertemp:TRegistry; //注册表类 begin if trim(OdbcName)='' then begin ErrorInfo:='ODBC数据源名称不能为空!'; RegOdbcAccess:=false; exit; end; if trim(DatabasePath)='' then begin ErrorInfo:='数据库文件不能为空!'; RegOdbcAccess:=false; exit; end; //以下为注册ODBC(Access) 和写信息到注册表 registertemp:=Tregistry.Create; with registertemp do begin Rootkey:=HKEY_LOCAL_MACHINE; try try //首先检测ODBC驱动程序是否安装 if not openkey('SOFTWARE\ODBC\ODBCINST.INI\Microsoft Access Driver (*.mdb)',FALSE) then begin ErrorInfo:='请按装 Microsoft Access 的ODBC驱动程序!'; RegOdbcAccess:=false; Exit; end; //注册Access closekey; if openkey('SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources',true) then writestring(OdbcName,'Microsoft Access Driver (*.mdb)'); closekey; If Openkey('SOFTWARE\ODBC\ODBC.INI\'+OdbcName,true) then begin Writestring('DBQ',DatabasePath); Writestring('Description',Desc); writestring('Driver','\odbcjt32.dll'); writeinteger('DriverID',25); writestring('FIL','MS Access;'); writestring('PWD',DatabasePassword); writeinteger('safeTransactions',0); writestring('UID',DatabaseUserName); closekey; if openkey('SOFTWARE\ODBC\ODBC.INI\erp_local\Engines\Jet',true) then begin writestring('ImplicitCommitSync',''); writeinteger('MaxBurrerSize',2048); writeinteger('PageTimeout',5); writeinteger('Threads',3); writestring('UserCommitSync','Yes'); end end; ErrorInfo:='创建成功!'; RegOdbcAccess:=true; except ErrorInfo:='创建失败,写注册表失败!'; RegOdbcAccess:=false; end; finally Closekey; Free; end; end; end; //注册SQL Server ODBC数据库连接信息到注册表 function RegOdbcSqlServer(OdbcName:string;Desc:string;DatabaseName:string;DatabaseUserName:string;Databasepassword:string;DatabaseServerName:string;var ErrorInfo:string):Boolean; var registertemp:TRegistry; //注册表类 begin if trim(OdbcName)='' then begin ErrorInfo:='ODBC数据源名称不能为空!'; RegOdbcSqlServer:=false; exit; end; if trim(DatabaseName)='' then begin ErrorInfo:='数据库名称不能为空!'; RegOdbcSqlServer:=false; exit; end; if trim(DatabaseUserName)='' then begin ErrorInfo:='数据库用户名不能为空!'; RegOdbcSqlServer:=false; exit; end; if trim(DatabaseServerName)='' then begin ErrorInfo:='数据库服务器名不能为空!'; RegOdbcSqlServer:=false; exit; end; //以下为注册ODBC(SQL SERVER) 和写信息到注册表 registertemp:=Tregistry.Create; with registertemp do begin Rootkey:=HKEY_LOCAL_MACHINE; try try //首先检测ODBC驱动程序是否安装 if not openkey('SOFTWARE\ODBC\ODBCINST.INI\SQL Server',FALSE) then begin ErrorInfo:='请按装 Microsoft SQL Server 的ODBC驱动程序!'; RegOdbcSqlServer:=false; Exit; end; //注册SQL SERVER closekey; if openkey('SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources',true) then writestring(OdbcName,'SQL Server'); closekey; If Openkey('SOFTWARE\ODBC\ODBC.INI\'+OdbcName,true) then begin Writestring('driver','\SQLSRV32.dll'); Writestring('lastuser',DatabaseUserName); Writestring('server',DatabaseServerName); Writestring('password',Databasepassword); Writestring('database',DatabaseName); Writestring('Description',Desc); End; ErrorInfo:='创建成功!'; RegOdbcSqlServer:=true; except ErrorInfo:='创建失败,写注册表失败!'; RegOdbcSqlServer:=false; end; finally Closekey; Free; end; end; end;
var s:string;
begin
s:=extractfilepath(application.ExeName)+'temp.mdb';
try
SQLConfigDataSource(0, 4, 'Microsoft Access Driver (*.mdb)',
'DSN=temp' + Chr(0) +
'Server=(local)' + Chr(0) +
'DBQ='+s + Chr(0) +
'Description=lingfeng');except
newmsg.ShowMessage('数据源创建失败!!')
end;
newmsg.ShowMessage('数据源创建成功!!')end;
function SQLConfigDataSource(hwndParent: Integer; fRequest: Integer;lpszDriverString: String; lpszAttributes: String): Integer;stdcall;external 'ODBCCP32.DLL';
function RegOdbcSybase(OdbcName:string;Desc:string;ServerName:string;DatabaseName:string;UserName:string;Password:string;var ErrorInfo:string):Boolean;
var
registertemp:TRegistry; //注册表类
begin
if trim(OdbcName)='' then begin
ErrorInfo:='ODBC数据源名称不能为空!';
RegOdbcSybase:=false;
exit;
end;
if trim(DatabaseName)='' then begin
ErrorInfo:='数据库名称不能为空!';
RegOdbcSybase:=false;
exit;
end;
if trim(ServerName)='' then begin
ErrorInfo:='Sybase客户端服务名称不能为空!';
RegOdbcSybase:=false;
exit;
end; //以下为注册ODBC(Sybase) 和写信息到注册表
registertemp:=Tregistry.Create;
with registertemp do begin
Rootkey:=HKEY_LOCAL_MACHINE;
try
try //注册Sybase
closekey;
if openkey('SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources',true) then
writestring(OdbcName,'Sybase System 11'); closekey;
If Openkey('SOFTWARE\ODBC\ODBC.INI\'+OdbcName,true) then
begin
Writestring('ApplicationName','');
Writestring('ApplicationUsingThreads','1');
Writestring('ArraySize','50');
Writestring('Charset','');
Writestring('CursorCacheSize','1');
Writestring('Database',DatabaseName);
Writestring('Databases',DatabaseName);
Writestring('Description',Desc);
Writestring('DirectoryServiceProvider','');
Writestring('Driver','\SYSYBNT.DLL');
Writestring('EnableQuotedIdentifiers','0');
Writestring('InitializationString','');
Writestring('InterfacesFile','');
Writestring('Language','');
Writestring('LogonID','');
Writestring('OptimizePrepare','2');
Writestring('PacketSize','0');
Writestring('PasswordEncryption','0');
Writestring('SecurityServiceProvider','');
Writestring('SelectMethod','1');
Writestring('ServerName',ServerName);
Writestring('Servers',ServerName);
Writestring('WorkStationID','');
Writestring('UserName',UserName);
Writestring('Password',Password);
End;
ErrorInfo:='创建成功!';
RegOdbcSybase:=true;
except
ErrorInfo:='创建失败,写注册表失败!';
RegOdbcSybase:=false;
end;
finally
Closekey;
Free;
end;
end;
end;ACCESS数据库:
//注册Access ODBC数据库连接信息到注册表
function RegOdbcAccess(OdbcName:string;Desc:string;DatabasePath:string;DatabaseUserName:string;DatabasePassword:string;var ErrorInfo:string):Boolean;
var
registertemp:TRegistry; //注册表类
begin
if trim(OdbcName)='' then begin
ErrorInfo:='ODBC数据源名称不能为空!';
RegOdbcAccess:=false;
exit;
end;
if trim(DatabasePath)='' then begin
ErrorInfo:='数据库文件不能为空!';
RegOdbcAccess:=false;
exit;
end; //以下为注册ODBC(Access) 和写信息到注册表
registertemp:=Tregistry.Create;
with registertemp do begin
Rootkey:=HKEY_LOCAL_MACHINE;
try
try
//首先检测ODBC驱动程序是否安装
if not openkey('SOFTWARE\ODBC\ODBCINST.INI\Microsoft Access Driver (*.mdb)',FALSE) then begin
ErrorInfo:='请按装 Microsoft Access 的ODBC驱动程序!';
RegOdbcAccess:=false;
Exit;
end;
//注册Access
closekey;
if openkey('SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources',true) then
writestring(OdbcName,'Microsoft Access Driver (*.mdb)'); closekey;
If Openkey('SOFTWARE\ODBC\ODBC.INI\'+OdbcName,true) then
begin
Writestring('DBQ',DatabasePath);
Writestring('Description',Desc);
writestring('Driver','\odbcjt32.dll');
writeinteger('DriverID',25);
writestring('FIL','MS Access;');
writestring('PWD',DatabasePassword);
writeinteger('safeTransactions',0);
writestring('UID',DatabaseUserName);
closekey;
if openkey('SOFTWARE\ODBC\ODBC.INI\erp_local\Engines\Jet',true) then
begin
writestring('ImplicitCommitSync','');
writeinteger('MaxBurrerSize',2048);
writeinteger('PageTimeout',5);
writeinteger('Threads',3);
writestring('UserCommitSync','Yes');
end
end;
ErrorInfo:='创建成功!';
RegOdbcAccess:=true;
except
ErrorInfo:='创建失败,写注册表失败!';
RegOdbcAccess:=false;
end;
finally
Closekey;
Free;
end;
end;
end; //注册SQL Server ODBC数据库连接信息到注册表
function RegOdbcSqlServer(OdbcName:string;Desc:string;DatabaseName:string;DatabaseUserName:string;Databasepassword:string;DatabaseServerName:string;var ErrorInfo:string):Boolean;
var
registertemp:TRegistry; //注册表类
begin
if trim(OdbcName)='' then begin
ErrorInfo:='ODBC数据源名称不能为空!';
RegOdbcSqlServer:=false;
exit;
end;
if trim(DatabaseName)='' then begin
ErrorInfo:='数据库名称不能为空!';
RegOdbcSqlServer:=false;
exit;
end;
if trim(DatabaseUserName)='' then begin
ErrorInfo:='数据库用户名不能为空!';
RegOdbcSqlServer:=false;
exit;
end;
if trim(DatabaseServerName)='' then begin
ErrorInfo:='数据库服务器名不能为空!';
RegOdbcSqlServer:=false;
exit;
end; //以下为注册ODBC(SQL SERVER) 和写信息到注册表
registertemp:=Tregistry.Create;
with registertemp do begin
Rootkey:=HKEY_LOCAL_MACHINE;
try
try
//首先检测ODBC驱动程序是否安装
if not openkey('SOFTWARE\ODBC\ODBCINST.INI\SQL Server',FALSE) then begin
ErrorInfo:='请按装 Microsoft SQL Server 的ODBC驱动程序!';
RegOdbcSqlServer:=false;
Exit;
end;
//注册SQL SERVER
closekey;
if openkey('SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources',true) then
writestring(OdbcName,'SQL Server'); closekey;
If Openkey('SOFTWARE\ODBC\ODBC.INI\'+OdbcName,true) then
begin
Writestring('driver','\SQLSRV32.dll');
Writestring('lastuser',DatabaseUserName);
Writestring('server',DatabaseServerName);
Writestring('password',Databasepassword);
Writestring('database',DatabaseName);
Writestring('Description',Desc);
End;
ErrorInfo:='创建成功!';
RegOdbcSqlServer:=true;
except
ErrorInfo:='创建失败,写注册表失败!';
RegOdbcSqlServer:=false;
end;
finally
Closekey;
Free;
end;
end;
end;
ODBC_ADD_DSN = 1; // 添加数据源
ODBC_CONFIG_DSN = 2; // 配置数据源
ODBC_REMOVE_DSN = 3; // 删除数据源
ODBC_ADD_SYS_DSN = 4; // 添加系统DSN
ODBC_CONFIG_SYS_DSN = 5; // 配置系统DSN
ODBC_REMOVE_SYS_DSN = 6; // 删除系统DSNtype
TSQLConfigDataSource = function( hwndParent: HWND;
fRequest: WORD;
lpszDriver: LPCSTR;
lpszAttributes: LPCSTR ) : BOOL; stdcall;
procedure Form1.FormCreate(Sender: TObject);
var
pFn: TSQLConfigDataSource;
hLib: LongWord;
strDriver: string;
strHome: string;
strAttr: string;
strFile: string;
fResult: BOOL;
ModName: array[0..MAX_PATH] of Char;
srInfo : TSearchRec;
begin
Windows.GetModuleFileName( HInstance, ModName, SizeOf(ModName) );
strHome := ModName;
while ( strHome[length(strHome)] <> '\' ) do
Delete( strHome, length(strHome), 1 );
strFile := strHome + 'TestData.MDB'; // 检查Access权限(Axes = Access)
hLib := LoadLibrary( 'ODBCCP32' );
if( hLib <> NULL ) then
begin
@pFn := GetProcAddress( hLib, 'SQLConfigDataSource' );
if( @pFn <> nil ) then
begin
// 强迫重建DSN
strDriver := 'Microsoft Access Driver (*.mdb)';
strAttr := Format( 'DSN=TestDSN'+#0+
'DBQ=%s'+#0+
'Exclusive=1'+#0+
'Description=Test Data'+#0+#0,
[strFile] );
fResult := pFn( 0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1] );
if( fResult = false ) then ShowMessage( '创建DSN (Datasource)失败!' ); // 检测/创建同DSN关联的 MDB 文件
if( FindFirst( strFile, 0, srInfo ) <> 0 ) then
begin
strDriver := 'Microsoft Access Driver (*.mdb)';
strAttr := Format( 'DSN=TestDSN'+#0+
'DBQ=%s'+#0+
'Exclusive=1'+#0+
'Description=Test Data'+#0+
'CREATE_DB="%s"'#0+#0,
[strFile,strFile] );
fResult := pFn( 0, ODBC_ADD_SYS_DSN, @strDriver[1], @strAttr[1] );
if( fResult = false ) then ShowMessage( '创建MDB文件失败!' );
end;
FindClose( srInfo ); end; FreeLibrary( hLib );
end
else
begin
ShowMessage( '无法加载ODBCCP32.DLL' );
end;
end;
--------------------------------------------------------------------------------
以下是在程序中动态创建ODBC的DSN数据源代码:
procedure TCreateODBCDSNfrm.CreateDSNBtnClick(Sender: TObject);
var
registerTemp : TRegistry;
bData : array[ 0..0 ] of byte;
begin
registerTemp := TRegistry.Create;
//建立一个Registry实例
with registerTemp do
begin
RootKey:=HKEY_LOCAL_MACHINE;
//设置根键值为HKEY_LOCAL_MACHINE
//找到Software\ODBC\ODBC.INI\ODBC Data Sources
if OpenKey('Software\ODBC\ODBC.INI
\ODBC Data Sources',True) then
begin //注册一个DSN名称
WriteString( 'MyAccess', 'Microsoft
Access Driver (*.mdb)' );
end
else
begin//创建键值失败
memo1.lines.add('增加ODBC数据源失败');
exit;
end;
CloseKey;
//找到或创建Software\ODBC\ODBC.INI
\MyAccess,写入DSN配置信息
if OpenKey('Software\ODBC\ODBC.INI
\MyAccess',True) then
begin
WriteString( 'DBQ', 'C:\inetpub\wwwroot
\test.mdb' );//数据库目录,连接您的数据库
WriteString( 'Description',
'我的新数据源' );//数据源描述
WriteString( 'Driver', 'C:\PWIN98\SYSTEM\
odbcjt32.dll' );//驱动程序DLL文件
WriteInteger( 'DriverId', 25 );
//驱动程序标识
WriteString( 'FIL', 'Ms Access;' );
//Filter依据
WriteInteger( 'SafeTransaction', 0 );
//支持的事务操作数目
WriteString( 'UID', '' );//用户名称
bData[0] := 0;
WriteBinaryData( 'Exclusive', bData, 1 );
//非独占方式
WriteBinaryData( 'ReadOnly', bData, 1 );
//非只读方式
end
else//创建键值失败
begin
memo1.lines.add('增加ODBC数据源失败');
exit;
end;
CloseKey;
//找到或创建Software\ODBC\ODBC.INI
\MyAccess\Engines\Jet
//写入DSN数据库引擎配置信息
if OpenKey('Software\ODBC\ODBC.INI
\MyAccess\Engines\Jet',True) then
begin
WriteString( 'ImplicitCommitSync', 'Yes' );
WriteInteger( 'MaxBufferSize', 512 );//缓冲区大小
WriteInteger( 'PageTimeout', 10 );//页超时
WriteInteger( 'Threads', 3 );//支持的线程数目
WriteString( 'UserCommitSync', 'Yes' );
end
else//创建键值失败
begin
memo1.lines.add('增加ODBC数据源失败');
exit;
end;
CloseKey;
memo1.lines.add('增加新ODBC数据源成功');
Free;
end;
end;