在本地我有两个子系统,用户数据源名称相同,但访问不同的数据库(Acess 2000),在各子系统中自动建立ODBC数据源。在运行其中一个子系统后,建立该子系统对应的数据源,要想在不删除ODBC数据源的情况下,运行另一个子系统,在这个子系统运行时,先检测数据源配置是否正确,如果不正确,则WriteString('DBQ',dir_name); //数据库 为什么在运行时,仍然无法配置,请高手指教。谢谢。100分赠送。
procedure Tsafe_mainForm.autoodbc();
var
registerTemp : TRegistry;
my_driver,dir_name,s,t:string;
i:integer;
index:array[1..10] of integer;
bData:array[ 0..0 ] of byte;
begin dir_name:=ExtractFilePath(Application.ExeName);
for i:=1 to 10 do
index[i]:=0;
i:=1;
while Pos('\',dir_name)>0 do
begin
index[i]:=Pos('\',dir_name);
dir_name[Pos('\', dir_name)]:= '/';
i:=i+1;
end;
dir_name:=ExtractFilePath(Application.ExeName);
dir_name:=leftstr(dir_name,index[i-2]);
dir_name:=dir_name+'data\shays.mdb'; registerTemp:=TRegistry.Create; //创建一个registry实例
with registerTemp do
begin
//RootKey:=HKEY_LOCAL_MACHINE; //设置根键值为HKEY_LOCAL_MACHINE,系统数据源
Rootkey:=HKEY_CURRENT_USER; //设置根键值为HKEY_LOCAL_MACHINE,用户数据源 // 找到Software\ODBC\ODBC.INI\ODBC Data Sources
if OpenKey('Software\ODBC\ODBC.INI\ODBC data sources',true)then
if readstring('shays')<>'' then
begin
if OpenKey('Software\ODBC\ODBC.INI\shays',true)then
begin
s:= ReadString('DBQ');
if s<> dir_name then
WriteString('DBQ',dir_name); //数据库目录
t:= ReadString('DBQ'); exit
end;
end
else
begin
//设置根键值为HKEY_LOCAL_MACHINE
Rootkey:=HKEY_LOCAL_MACHINE;
// 找到Software\ODBC\ODBCINST.INI\Microsoft Access Driver (*.mdb)
if OpenKey('Software\ODBC\ODBCINST.INI\Microsoft Access Driver (*.mdb)',true)then
my_driver:=readstring('Driver')
else
begin
Application.MessageBox('增加ODBC数据源失败','警告',MB_ICONHAND);
exit;
end;
closekey; Rootkey:=HKEY_CURRENT_USER;
if openkey('Software\ODBC\ODBC.INI\ODBC data sources',true)then
writestring('shays','Microsoft Access Driver (*.mdb)')
else
begin
Application.MessageBox('增加ODBC数据源失败','警告',MB_ICONHAND);
exit;
end;
closekey; //找到或创建Software\ODBC\ODBC.INI\shays,写入DSN配置信息
if OpenKey('Software\ODBC\ODBC.INI\shays',true)then
begin
WriteString('DBQ',dir_name+'data\shays.mdb'); //数据库目录
writestring('Description','我的数据库设置'); //数据源描述
writestring('Driver',my_driver); //驱动程序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
Application.MessageBox('增加ODBC数据源失败','警告',MB_ICONHAND);
exit;
end;
closekey;
//找到或创建software\ODBC\ODBC.INI\shays\Engines\Jet
//写入DSN数据库引擎配置信息
if openkey('software\ODBC\ODBC.INI\shays\Engines\Jet',True)then
begin
writestring('ImplicitCommitSync','Yes');
writeinteger('MaxBufferSize',512); //缓冲区大小
writeinteger('PageTimeout',10); //页超时
writeinteger('Threads',3); //支持的线程数目
writestring('UserCommitSync','yes');
end
else
begin
Application.MessageBox('增加ODBC数据源失败','警告',MB_ICONHAND);
exit;
end;
closekey;
end;
Free;
end;
end;
procedure Tsafe_mainForm.autoodbc();
var
registerTemp : TRegistry;
my_driver,dir_name,s,t:string;
i:integer;
index:array[1..10] of integer;
bData:array[ 0..0 ] of byte;
begin dir_name:=ExtractFilePath(Application.ExeName);
for i:=1 to 10 do
index[i]:=0;
i:=1;
while Pos('\',dir_name)>0 do
begin
index[i]:=Pos('\',dir_name);
dir_name[Pos('\', dir_name)]:= '/';
i:=i+1;
end;
dir_name:=ExtractFilePath(Application.ExeName);
dir_name:=leftstr(dir_name,index[i-2]);
dir_name:=dir_name+'data\shays.mdb'; registerTemp:=TRegistry.Create; //创建一个registry实例
with registerTemp do
begin
//RootKey:=HKEY_LOCAL_MACHINE; //设置根键值为HKEY_LOCAL_MACHINE,系统数据源
Rootkey:=HKEY_CURRENT_USER; //设置根键值为HKEY_LOCAL_MACHINE,用户数据源 // 找到Software\ODBC\ODBC.INI\ODBC Data Sources
if OpenKey('Software\ODBC\ODBC.INI\ODBC data sources',true)then
if readstring('shays')<>'' then
begin
if OpenKey('Software\ODBC\ODBC.INI\shays',true)then
begin
s:= ReadString('DBQ');
if s<> dir_name then
WriteString('DBQ',dir_name); //数据库目录
t:= ReadString('DBQ'); exit
end;
end
else
begin
//设置根键值为HKEY_LOCAL_MACHINE
Rootkey:=HKEY_LOCAL_MACHINE;
// 找到Software\ODBC\ODBCINST.INI\Microsoft Access Driver (*.mdb)
if OpenKey('Software\ODBC\ODBCINST.INI\Microsoft Access Driver (*.mdb)',true)then
my_driver:=readstring('Driver')
else
begin
Application.MessageBox('增加ODBC数据源失败','警告',MB_ICONHAND);
exit;
end;
closekey; Rootkey:=HKEY_CURRENT_USER;
if openkey('Software\ODBC\ODBC.INI\ODBC data sources',true)then
writestring('shays','Microsoft Access Driver (*.mdb)')
else
begin
Application.MessageBox('增加ODBC数据源失败','警告',MB_ICONHAND);
exit;
end;
closekey; //找到或创建Software\ODBC\ODBC.INI\shays,写入DSN配置信息
if OpenKey('Software\ODBC\ODBC.INI\shays',true)then
begin
WriteString('DBQ',dir_name+'data\shays.mdb'); //数据库目录
writestring('Description','我的数据库设置'); //数据源描述
writestring('Driver',my_driver); //驱动程序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
Application.MessageBox('增加ODBC数据源失败','警告',MB_ICONHAND);
exit;
end;
closekey;
//找到或创建software\ODBC\ODBC.INI\shays\Engines\Jet
//写入DSN数据库引擎配置信息
if openkey('software\ODBC\ODBC.INI\shays\Engines\Jet',True)then
begin
writestring('ImplicitCommitSync','Yes');
writeinteger('MaxBufferSize',512); //缓冲区大小
writeinteger('PageTimeout',10); //页超时
writeinteger('Threads',3); //支持的线程数目
writestring('UserCommitSync','yes');
end
else
begin
Application.MessageBox('增加ODBC数据源失败','警告',MB_ICONHAND);
exit;
end;
closekey;
end;
Free;
end;
end;
不过也有别的办法嘛 你可以用ADO 字符传连接 一个库用一个连接字符传 O