请问,如何在程序中动态注册ODBC数据源?谢谢
解决方案 »
- 自己编写了一个组件,生成包,安装成功,却没在组件页找到组件?
- 关于鞋厂的数据库结构,欢迎大家来讨论.
- 怎樣在DELPHI的第三控件DBNavigator1中加入代碼?
- ★★★★★★高手请入★★★★★★对于数据库中存储有大量图片字段的数据表,如何尽量减小数据库的体积呢?access数据库,存储图片用OLE
- 用fastreport如何实现这样的折行打印
- ShellExecute如何调用word开启一个文档?
- 怎么在Delphi环境下对Access数据库设置密码?
- 请问各位高手,delphi6中的DBCtrlGrid控件是否可以多选?如果想在数据集中多选的话如何写代码?
- 自己写的浏览器为什么不支持拷贝粘贴?
- 为什么在type libariry中增加方法,不会更新对应的pas文件?
- 光驱弹出代码,报错,麻烦看一下!
- CoolSlob快来!
深圳
王发军
---- 在DELPHI数据库应用程序中,我们访问数据库通常有两种方法.一种是通过BDE数据库搜索引擎,即利用DELPHI自带的数据库驱动程序,这种方法的优点是速度快,但应用范围有限,当数据库版本更新时,有可能不能用于操作新的数据库;另一种方法是通过ODBC,这种方法的优点是可以随操作系统(如WINDOWS)提供,作为标准接口能适应多种数据库,缺点是速度慢.在编程时,我们可以根据需要选择其中的一种方法. ---- 在利用ODBC访问数据库时,通常的方法时是在ODBC管理面板中设置一个ODBC系统数据源 (系统DSN),然后在DBD中或在程序中设置一个数据库别名(Alias)对应该DSN,这样就可以如愿以偿地操作数据库了.相信用DELPHI做过数据库应用的程序员对这方面已经很熟悉了,笔者就不多说了.在实际应用中,笔者曾遇到过这样的情况,我们的数据库应用程序是依靠ODBC系统数据源访问和操作数据库的,应用程序运行一直良好,直到某一天,一个对WINDOWS系统较为熟悉但又不太精通的用户不慎修改或删除了我们预先设置的系统DSN...... ---- 于是,笔者就开始研究怎么在程序中动态地设置ODBC系统DSN的内容,这样就可以增加自己程序的坚固性了.经过整整一天对WINDOWS注册表的研究,终于找到了ODBC管理程序设置DSN的秘密("天地自有公道,付出总会回报!",不是做广告!),现写出来与大家共享,也请高手指教. ---- ODBC管理程序设置DSN的秘密在注册表中,不信可以到HKEY_LOCAL_MACHINE\Software\ODBC去看看,肯定让你感觉已经成功了一半. ---- 首先来看看系统中已安装的ODBC数据库驱动程序.在HKEY_LOCAL_MACHINE\Software\ODBC\ ODBCInst.INI中,存放着已经安装了的ODBC数据库驱动程序的信息,从这里可以查到已安装的ODBC数据库驱动程序对应的DLL文件等信息.在ODBCInst.INI\ODBC Drivers的各个键值中,键名是驱动程序名称(如Microsoft Access Driver(*.mdb)),键值为“Installed”,表示驱动程序已安装.在 ODBCInst.INI\DriverName(DriverName为一个驱动程序名称,如Microsoft Access Driver(*.mdb)) 中,有驱动程序的详细信息,我们主要从这里获得ODBC驱动程序对应的DLL文件的路径和文件名,即键名Driver的键值,一般为"C:\WINDOWS\SYSTEM\FileName.DLL". ---- 然后来看系统DSN的注册信息,在HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI中,存放着系统 DSN的注册信息,我们在ODBC管理面板设置的DSN参数就在这里. ---- 下面来看看创建一个ODBC系统DSN的步骤,即我们在ODBC管理面板中完成参数设置后,ODBC管理程序是怎么在注册表中注册DSN信息的.以创建一个名称为MyAccess的Ms Access97类型的系统DSN为例,我们指定的参数主要有数据库类型(Microsoft Access Driver(*.mdb))、数据源名称(MyAccess)、数据源描述(我的ACCESS)、数据库路径(C:\Inetpub\wwwroot\Test.mdb),其它参数如用户名称、用户密码、独占、只读、系统数据库、默认目录、缓冲区大小、扫描行数、页超时等采用系统缺省参数.这时,注册系统DSN一般应有以下几个步骤: ---- 1.在HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\ODBC Data Sources中增加一个字符串键值,为MyAccess = Microsoft Access Driver(*.mdb),其中分别为数据源名称和数据库类型.这是在注册表中注册一个系统DSN名称. ---- 2.在HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI中创建一个子键(SubKey)MyAccess,即创建一个键为HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\MyAccess,然后在其下创建一些键值,详细描述一个系统DSN的配置信息,主要信息有([]中的内容为笔者注释): DBQ=C:\Inetpub\wwwroot\Test.mdb
[字符串,表示数据库路径]
Description=我的ACCESS
[字符串,表示数据库描述]
Driver=C:\PWIN98\System\odbcjt32.dll
[字符串,表示驱动程序,可见ODBCINST.INI]
DriverId=0x00000019(25)
[数字,表示驱动程序标识,不能改变]
FIL=Ms Access;
[字符串,可能与过滤Filter有关]
SafeTransaction=0x00000000
[数字,可能表示支持事务性操作的个数]
UID=""
[字符串,表示用户名称,此处为空字符串]---- 3.在HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\MyAccess中创建一个子键(SubKey)Engines, 再在其下创建子键(SubKey)Jet,即创建一个键为 HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\MyAccess\Engines\Jet,然后在其下创建一些 键值,详细描述一个系统DSN的数据库引擎配置信息,主要信息有([]中的内容为笔者注释): ImplicitCommitSync=Yes
[字符串,可能表示是否立即反映数据修改]
MaxBufferSize=0x00000200(512)
[数字,表示缓冲区大小]
PageTimeout=0x00000005(5)
[数字,表示页超时]
Threads=0x00000003(3)
[数字,可能表示支持的最大线程数目]
UserCommitSync=Yes
[字符串,可能表示是否立即将数据修改反映到用户]---- 以上是建立一个系统DSN的基本信息(其它信息如选项或高级选项等信息也在这里设置,只不过因采用默认信息,注册表里没有列出),我们在程序中按上述步骤操作注册表,同样也能增加一个系统DSN或修改其配置.在下面的例子程序中,将按以上步骤建立一个系统DSN,请注意程序中的注释. {*******************************************************
在本程序中,将创建一个ODBC系统数据源(DSN),
数据源名称:MyAccess 数据源描述:我的新数据源
数据库类型:ACCESS97
对应数据库:C:\Inetpub\wwwroot\test.mdb
*******************************************************}
{ 注意应在USES语句中包含Registry }
procedure TForm1.Button1Click(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;
{************************建立注册表********************}
procedure TMainfrm.Createdatasource(dsnname,dbname,mdbroot:string);
var
DsnDec, DriverRoot,ODBCINIRoot,UserName,Drivername : string;
registerTemp : TRegistry ;
begin
DsnDec := '';
ODBCINIRoot := '\Software\ODBC\ODBC.INI\';
UserName := '';
DriverName :='Microsoft Access Driver (*.mdb)';
registerTemp := TRegistry.Create ;//建立一个Registry实例
with registerTemp do
begin
RootKey := HKEY_LOCAL_MACHINE;
if OpenKey('Software\ODBC\ODBCINST.INI\Microsoft Access Driver (*.mdb)',false) then
DriverRoot := ReadString('Driver')
else
begin
exit;
end; RootKey := HKEY_CURRENT_USER ;
//找到Software\ODBC\ODBC.INI\ODBC Data Source
if OpenKey( ODBCINIRoot+'ODBC Data Sources',True) then
begin
WriteString(DsnName,'Microsoft Access Driver (*.mdb)');
end
else
begin
exit;
end;
CloseKey; ///找到或创建Software\ODBC\ODBC.INI\MyAccess,写入DSN配置信息
if OpenKey( ODBCINIRoot + DsnName ,True) then
begin
WriteString('DBQ',MdbRoot);
WriteString('Description',DsnDec);
WriteString('Driver',DriverRoot);
WriteInteger('DriverId',25);
WriteString('FIL','Ms Access;');
WriteInteger('SafeTransaction',0);
WriteString('UID',Username);
end
else
begin
exit;
end;
CloseKey; if OpenKey( ODBCINIRoot+ DsnName + '\Engines\Jet',True) then
begin
Writestring('ImplicitCommitSync','Yes');
WriteInteger('MaxBufferSize',2048);
WriteInteger('PageTimeout',5);
WriteInteger('Threads',3);
WriteString('UserCommitSync','Yes');
end
else
begin
exit;
end;
CloseKey;
Free;
end;
end;
begin
Reg:=TRegistry.Create;
Reg.RootKey:=windows.HKEY_LOCAL_MACHINE;
if Reg.OpenKey('\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources',false) then
begin
if Application.MessageBox('没有该建,是否要创建它','警告',MB_YesNO) = IDYES THEN
BEGIN
if Reg.OpenKey('\SOFTWARE\ODBC\ODBC.INI\ODBC Data Sources',true) then
begin
Reg.WriteString(EdtODBC.Text,'SQL Server');
Reg.CloseKey;
end;
if Reg.OpenKey('\SOFTWARE\ODBC\ODBC.INI\'+EdtODBC.Text,true) then
begin
try
Reg.WriteString('Database',DataBase.Text);
Reg.WriteString('Drivre',Driver.Text);
Reg.WriteString('LastUser','sa');
Reg.WriteString('Server',Server.Text);
Reg.CloseKey;
Finally
showMessage('创建成功!');
end;
end;
end;
end;
查msdn可以有更详细的帮助
这里先给出c++的代码#include <stdio.h>#include <windows.h>#include "sql.h"#include <odbcinst.h>int main(){RETCODE retcode; UCHAR *szDriver = "SQL Server";UCHAR *szAttributes ="DSN=MyDSN\0DESCRIPTION=SQLConfigDSN Sample\0""SERVER=MySQL\0ADDRESS=MyServer\0NETWORK=dbmssocn\0""DATABASE=pubs\0"; retcode = SQLConfigDataSource(NULL, ODBC_ADD_DSN, szDriver, szAttributes);
}
''DSN=Record_ODBC''+ chr(0) +
''Server=(local)''+ chr(0) +
''Database=master''+ chr(0) +
''Description=DragonPC SQLServer ODBC Source''+ chr(0));
这是我的Delphi程序中调用该函数的一个实例,第一个参数是父窗口句柄,设置为0则该函数不显示任何对话框。第二个参数是操作类型,你需要定义如下的操作类型常量: Const
ODBC_ADD_DSN = 1; // Add a new user data source.
ODBC_CONFIG_DSN = 2; // Configure (modify) an existing user data source.
ODBC_REMOVE_DSN = 3; // Remove an existing user data source.
ODBC_ADD_SYS_DSN = 4; // Add a new system data source.
ODBC_CONFIG_SYS_DSN = 5; // Modify an existing system data source.
ODBC_REMOVE_SYS_DSN = 6; // Remove an existing system data source.
从名字我们知道,要添加ODBC源,我们需要调用的是ODBC_ADD_SYS_DSN 或是ODBC_ADD_DSN参数。第三个参数也没有什么好说的,我们添加的是SQL Server数据库的ODBC源,所以填入''SQL Server''参数,如果需要建立Excel文件的ODBC数据源,我们可以填入''Excel Files (*.xls)'',这些字符串参数相信各位同志在添加ODBC源时,已经多次见过。 关键的是第三个参数的设置,不同的数据库类型所支持的关键字是不一样的,这里仅仅就SQL Server所支持的关键字作一个简单说明: DSN:你的ODBC数据源名称。 Server:你的数据库服务器名称,使用(local)指的是本地计算机安装的数据库。注:最新的SQL Server 2000支持一台计算机运行多个SQL Server服务,这个时候你需要指定SqlSever的InstanceName。 Address:指定SQL Server服务器的网络IP地址。 Database:指定默认数据库名称。 Language:指定默认语言。 Description:备注信息。 详细的参数和信息可以查阅微软网站的以下网址。 http://msdn.microsoft.com/library/psdk/dasdk/odch3kit.htm http://msdn.microsoft.com/library/psdk/sql/od_odbc_c_99yd.htm
//创建数据源
dns:='swtz';
dbs:='swtz';
//读注册表
ww:=Tregistry.Create;
ww.rootkey:=HKEY_LOCAL_MACHINE;
//
ww.openkey('software',FALSE);
ww.OpenKey ('ODBC',FALSE);
ww.OpenKey ('ODBC.INI',FALSE);
// ww.createkey('位置');
ww.OpenKey ('ODBC DATA SOURCES',True);
if(ww.readstring(DNS)='SQL Server') then
begin
// SHOWMESSAGE('此数剧源已存在!');
ww.CloseKey ;
ww.Destroy ;
end
ELSE
BEGIN
ww.WriteString (DNS,'SQL Server');
ww.CloseKey ;
// ww.rootkey:=HKEY_CURRENT_USER;
ww.openkey('software',FALSE);
ww.OpenKey ('ODBC',false);
ww.openkey('ODBC.INI',true);
ww.createkey(DNS);
ww.OpenKey (DNS,True);
ww.WriteString ('Database',DBS);
ww.WriteString ('Driver','C:\WINDOWS\SYSTEM\sqlsrv32.dll');
ww.WriteString ('LastUser','sa');
ww.WriteString ('Server','(local)');
ww.CloseKey ;
ww.Destroy ;
END;