《在delphi程序中自动设置odbc数据源》由会员分享,可在线阅读,更多相关《在delphi程序中自动设置odbc数据源(9页珍藏版)》请在金锄头文库上搜索。
1、在在 DELPHIDELPHI 程序中自动设置程序中自动设置 ODBCODBC 数据源数据源日期:2004 年 9 月 14 日 作者: 人气:4140 查看:大字体 中字体 小字体 在 DELPHI 数据库应用程序中,我们访问数据库通常有两种方法一种是通过 BDE 数据库搜索引擎,即利用 DELPHI 自带的数据库驱动程序,这种方法的优点是速度快,但应用范围有限,当数据库版本更新时,有可能不能用于操作新的数据库;另一种方法是通过 ODBC,这种方法的优点是可以随操作系统(如 WINDOWS)提供,作为标准接口能适应多种数据库,缺点是速度慢在编程时,我们可以根据需要选择其中的一种方法在利用 O
2、DBC 访问数据库时,通常的方法时是在 ODBC 管理面板中设置一个 ODBC 系统数据源(系统 DSN),然后在 DBD 中或在程序中设置一个数据库别名(Alias)对应该 DSN,这样就可以如愿以偿地操作数据库了相信用 DELPHI 做过数据库应用的程序员对这方面已经很熟悉了,笔者就不多说了在实际应用中,笔者曾遇到过这样的情况,我们的数据库应用程序是依靠 ODBC 系统数据源访问和操作数据库的,应用程序运行一直良好,直到某一天,一个对 WINDOWS 系统较为熟悉但又不太精通的用户不慎修改或删除了我们预先设置的系统 DSN.于是,笔者就开始研究怎么在程序中动态地设置 ODBC 系统 DSN
3、的内容,这样就可以增加自己程序的坚固性了经过整整一天对WINDOWS 注册表的研究,终于找到了 ODBC 管理程序设置 DSN 的秘密(天地自有公道,付出总会回报!,不是做广告!) ,现写出来与大家共享,也请高手指教ODBC 管理程序设置 DSN 的秘密在注册表中,不信可以到HKEY_LOCAL_MACHINESoftwareODBC 去看看,肯定让你感觉已经成功了一半首先来看看系统中已安装的 ODBC 数据库驱动程序在HKEY_LOCAL_MACHINESoftwareODBC ODBCInst.INI 中,存放着已经安装了的 ODBC 数据库驱动程序的信息,从这里可以查到已安装的ODBC
4、数据库驱动程序对应的 DLL 文件等信息在ODBCInst.INIODBC Drivers 的各个键值中,键名是驱动程序名称(如 Microsoft Access Driver(*.mdb),键值为“Installed” ,表示驱动程序已安装在 ODBCInst.INIDriverName(DriverName 为一个驱动程序名称,如 Microsoft Access Driver(*.mdb)中,有驱动程序的详细信息,我们主要从这里获得 ODBC 驱动程序对应的DLL 文件的路径和文件名,即键名 Driver 的键值,一般为“C:WINDOWSSYSTEMFileName.DLL“然后来看系
5、统 DSN 的注册信息,在HKEY_LOCAL_MACHINESoftwareODBCODBC.INI 中,存放着系统 DSN的注册信息,我们在 ODBC 管理面板设置的 DSN 参数就在这里下面来看看创建一个 ODBC 系统 DSN 的步骤,即我们在 ODBC 管理面板中完成参数设置后,ODBC 管理程序是怎么在注册表中注册DSN 信息的以创建一个名称为 MyAccess 的 Ms Access97 类型的系统 DSN 为例,我们指定的参数主要有数据库类型(Microsoft Access Driver(*.mdb)、数据源名称(MyAccess)、数据源描述(我的ACCESS)、数据库路径
6、(C:InetpubwwwrootTest.mdb),其它参数如用户名称、用户密码、独占、只读、系统数据库、默认目录、缓冲区大小、扫描行数、页超时等采用系统缺省参数这时,注册系统 DSN 一般应有以下几个步骤:在 HKEY_LOCAL_MACHINESoftwareODBCODBC.INIODBC Data Sources 中增加一个字符串键值,为 MyAccess = Microsoft Access Driver(*.mdb),其中分别为数据源名称和数据库类型这是在注册表中注册一个系统 DSN 名称在 HKEY_LOCAL_MACHINESoftwareODBCODBC.INI 中创建一个
7、子键(SubKey)MyAccess,即创建一个键为HKEY_LOCAL_MACHINESoftwareODBCODBC.INIMyAccess,然后在其下创建一些键值,详细描述一个系统 DSN 的配置信息,主要信息有(中的内容为笔者注释):DBQ=C:InetpubwwwrootTest.mdb 字符串,表示数据库路径Description=我的 ACCESS 字符串,表示数据库描述Driver=C:PWIN98Systemodbcjt32.dll 字符串,表示驱动程序,可见 ODBCINST.INIDriverId=0x00000019(25) 数字,表示驱动程序标识,不能改变FIL=Ms
8、 Access; 字符串,可能与过滤 Filter 有关SafeTransaction=0x00000000 数字,可能表示支持事务性操作的个数UID=“ 字符串,表示用户名称,此处为空字符串在HKEY_LOCAL_MACHINESoftwareODBCODBC.INIMyAccess 中创建一个子键(SubKey)Engines,再在其下创建子键(SubKey)Jet,即创建一个键为 HKEY_LOCAL_MACHINESoftwareODBCODBC.INIMyAccessEnginesJet,然后在其下创建一些键值,详细描述一个系统 DSN 的数据库引擎配置信息,主要信息有(中的内容为笔
9、者注释):ImplicitCommitSync=Yes 字符串,可能表示是否立即反映数据修改MaxBufferSize=0x00000200(512) 数字,表示缓冲区大小PageTimeout=0x00000005(5) 数字,表示页超时Threads=0x00000003(3) 数字,可能表示支持的最大线程数目UserCommitSync=Yes 字符串,可能表示是否立即将数据修改反映到用户以上是建立一个系统 DSN 的基本信息(其它信息如选项或高级选项等信息也在这里设置,只不过因采用默认信息,注册表里没有列出),我们在程序中按上述步骤操作注册表,同样也能增加一个系统DSN 或修改其配置在
10、下面的例子程序中,将按以上步骤建立一个系统 DSN,请注意程序中的注释*在本程序中,将创建一个 ODBC 系统数据源(DSN),数据源名称:MyAccess 数据源描述:我的新数据源数据库类型:ACCESS97对应数据库:C:Inetpubwwwroottest.mdb* 注意应在 USES 语句中包含 Registry procedure TForm1.Button1Click(Sender: TObject);varregisterTemp : TRegistry;bData : array 0.0 of byte;beginregisterTemp := TRegistry.Create
11、; /建立一个 Registry 实例with registerTemp dobeginRootKey:=HKEY_LOCAL_MACHINE;/设置根键值为HKEY_LOCAL_MACHINE/找到 SoftwareODBCODBC.INIODBC Data Sourcesif OpenKey(SoftwareODBCODBC.INIODBC Data Sources,True) thenbegin /注册一个 DSN 名称WriteString( MyAccess, Microsoft Access Driver (*.mdb) );endelsebegin/创建键值失败memo1.lin
12、es.add(增加 ODBC 数据源失败);exit;end;CloseKey;/找到或创建 SoftwareODBCODBC.INIMyAccess,写入 DSN 配置信息if OpenKey(SoftwareODBCODBC.INIMyAccess,True) thenbeginWriteString( DBQ, C:inetpubwwwroottest.mdb );/数据库目录WriteString( Description, 我的新数据源 );/数据源描述WriteString( Driver, C:PWIN98SYSTEModbcjt32.dll );/驱动程序 DLL 文件Writ
13、eInteger( DriverId, 25 );/驱动程序标识 WriteString( FIL, Ms Access; );/Filter 依据WriteInteger( SafeTransaction, 0 );/支持的事务操作数目WriteString( UID, );/用户名称bData0 := 0;WriteBinaryData( Exclusive, bData, 1 );/非独占方式WriteBinaryData( ReadOnly, bData, 1 );/非只读方式endelse/创建键值失败beginmemo1.lines.add(增加 ODBC 数据源失败);exit;
14、end;CloseKey;/找到或创建 SoftwareODBCODBC.INIMyAccessEnginesJet/写入 DSN 数据库引擎配置信息if OpenKey(SoftwareODBCODBC.INIMyAccessEnginesJet,True) thenbeginWriteString( ImplicitCommitSync, Yes );WriteInteger( MaxBufferSize, 512 );/缓冲区大小WriteInteger( PageTimeout, 10 );/页超时WriteInteger( Threads, 3 );/支持的线程数目WriteStri
15、ng( UserCommitSync, Yes );endelse/创建键值失败beginmemo1.lines.add(增加 ODBC 数据源失败);exit;end;CloseKey;memo1.lines.add(增加新 ODBC 数据源成功);Free;end;end;以上程序在 PWIN98+DELPHI3.0 下调试通过下面是创建常见数据库类型的 DSN 需要设置的信息(为注释内容,除特殊注释外,各参数可见前面说明):Access(Microsoft Access Driver(*.mdb)DBQ、Description、Driverodbcjt32.dll、DriverID25、FILMs Access;、SafeTransaction默认为 0、UID默认为空、EnginesJetImplicitCommitSync默认为 Yes、EnginesJetMaxBufferSize默认 512、EnginesJetPageTimeout