说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

在DELPHI程序中自动设置ODBC数据源

HTML文档下载 WORD文档下载 PDF文档下载
在DELPHI程序中自动设置ODBC数据源

在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;

以上程序在PWIN98+DELPHI3.0下调试通过.

下面是创建常见数据库类型的DSN需要设置的信息([]为注释内容,除特殊注释外,各参数可见前面说明):

1.Access(Microsoft Access Driver(*.mdb))

DBQ、Description、Driver[odbcjt32.dll]、DriverID[25]、FIL[Ms Access;]、

SafeTransaction[默认为0]、UID[默认为空]、

Engines\Jet\ImplicitCommitSync[默认为Yes]、Engines\Jet\MaxBufferSize[默认512]、

Engines\Jet\PageTimeout[默认为512]、Engines\Jet\Threads[默认为3]、

Engines\Jet\UserCommitSync[默认为Yes]

可选设置:SystemDb[字符串,系统数据库的路径]、

ReadOnly[二进制,是否以只读方式打开,1为是,默认为0]、

Exclusive[二进制,是否以独占方式打开,1为是,默认为0]、

PWD[字符串,用户密码]

2.EXCEL(Microsoft Excel Driver(*.xls))

DBQ[Excel97(=path\xxx.xls)、5.0/7.0(=path\xxx.xls)、4.0(=path)、3.0(=path)]、

Description、Driver[odbcjt32.dll]、

DefaultDir[Excel97(<>DBQ)、5.0/7.0(<>DBQ)、4.0(=DBQ)、3.0(=DBQ)]、

DriverID[790(Excel97)、22(5.0/7.0)、278(4.0)、534(3.0)]、

FIL[Excel5.0;]、ReadOnly、SafeTransaction、UID、

Engines\Excel\ImplicitCommitSync、Engines\Excel\MaxScanRows[数字,扫描行数,默认为8]、

Engines\Excel\Threads、Engines\Excel\UserCommitSync、

Engines\Excel\FirstRowHasName[二进制,第一行是否是域名,1表示是,默认为1]

注: Excel97和Excel7.0/5.0的DBQ对应一个XLS文件,而Excel4.0和Excel3.0则对应一个目录;

DefaultDir对应一个目录,在Excel97和Excel7.0/5.0中是DBQ所对应的路径,而在

Excel4.0和Excel3.0下则与DBQ相同;各个版本的DriverID不同.

3.dBase(Microsoft dBase Driver(*.dbf))

DefaultDir[字符串,数据库文件所在目录]、Description、Driver[odbcjt32.dll]、

DriverID[277(IV)、533(5.0)]、FIL[dbase III;]、SafeTransaction、UID、

Engines\Xbase\ImplicitCommitSync、

Engines\Xbase\Collating[字符串,排序依据,可为ASCII、International、Norwegian-Danish、

Swedish-Finnish]、

Engines\Xbase\Deleted[二进制,是否不显示被软删除的记录,0表示显示,默认为1]、

Engines\Xbase\PageTimeout[默认为600]、Engines\Xbase\UserCommitSync、

Engines\Xbase\Threads、Engines\Xbase\Statistics[二进制,是否用大约的行数,1为是,默认0]

注:(dBaseIV和dBase5.0两个版本的DriverId有不同)

4.Foxpro(Microsoft Foxpro Driver(*.dbf))

DefaultDir[数据库文件所在目录]、Description、Driver[odbcjt32.dll]、

DriverID[536(2.6)、280(2.5)]、FIL[Foxpro 2.0;]、SafeTransaction、UID、

Engines\Xbase\Collating[字符串,排序依据,可为ASCII、International]、

Engines\Xbase\Deleted[二进制,是否不显示被软删除的记录,0表示显示,默认为1]、

Engines\Xbase\PageTimeout[默认为600]、Engines\Xbase\UserCommitSync、

Engines\Xbase\Threads、Engines\Xbase\Statistics[二进制,是否用大约的行数,1为是,默认0]

注:(Foxpro2.5和Foxpro2.6两个版本的DriverId有不同)

把上面程序做成一个COM或ActiveX控件吧,在很多高级程序设计语言如DELPHI、C++Buider、VB、VC、PB中都能用到的.

Android导出一个JAR库 APK汉化原理及方法 APK文件格式分析,Android反编译入门(一) ApiDemos中的Android Widget例子解析 APK签名导出向导 - Use the Export Wizard 剖析Android自带Widget - Music播放器 剖析Android自带Widget - Clock指针钟表 C#取得Excel工作簿工作表名称 C#中用Automation自动化方式对Excel的操作 VB如何打开或保存为有密码保护的Excel sheets工作表 VB在Excel表格文件中搜索指定内容 VB复制Excel表到另外一个Excel中 Java实现生成网站快照缩略图片 php实现生成网站快照缩略图片 C#实现生成网站快照缩略图片 VB比较两个Excel表格的内容 VB实现Excel按列或行排序 VB删除EXCEL表格指定行 用vb.net写的验证码识别代码 VB删除EXCEL表格指定列 Oracle数据库Windows 2003环境自动备份批处理 VB通过ADODB连接EXCEL表格文件读取数据 使用VBScript卸载软件 Discuz X2用户注册过程SQL Android手机参数表 用jQuery改变图片(image src) 用std::atomic實現簡單的讀寫鎖 ChinaPay网上支付网关.NET开发 VOB生成IFO文件用nero刻录DVD详解 15款开源Android游戏引擎(安卓免费游戏引擎) 将MVC ASPX转换到Razor视图 救急:Win me开始菜单及Taskbar的小图标都变花了,如何解决?up有分 ############狂送分,附带一个小问题########### 在bc中怎样创建资源文件?? 请高手进入,急!在线等待 生活有你 更新后台數據,用試圖就可以,用代碼就不行? ★★★CFormView的大小,高手没必要进,低手就可以解决了! 不超过十行,但.....(C) 打到雍亲王 "准女朋友的胸太平了,我该如何取舍? " 准备结贴了,要顶的赶快顶呀,去晚了就没机会了 为什么我从数据采集仪采集到的数据是乱码? 请教:动态的下拉菜单怎样做?在线等待,答对就给分! 有谁知道用vb如何把bmp的文件转换为jpg格式?? sql server2000是不是不能在winxp 专业版下安装?? 请问大家 wait函数的使用问题(给100) 关于wait函数的使用问题(给100) 如何在xp下能够删除带子目录的文件夹? [求助]关于考试座位号随机分配问题! 无奈的我等你的帮助! 在delphi中如何建立一个doc文件? 有谁可以帮帮忙(在线等待) 请问大家如何防止DEDE的,我发现许多软件没有进行压缩也无法进行DEDE反编译,通常只能进行到一半 现代制造业企业管理系统的开发 (C++ builder) 线程设计,帮帮忙!!! 关于flash中的actionscript 如何做自动评分的考试系统?给点建议或意见! 告急!!!主从表的问题,怎样修改从表时,让主表的数据跟着变化? 刚刚在新闻组看到的东西, 让大家乐乐(转贴) 关于ASP.NET的讨论,欢迎大家指正. 再发:请教在Rave 报表中如何在每一页上都显示打印表头 关于视图的问题!!!很急,各位大哥帮帮忙!! CrystalReports(水晶报表)的版权问题 请看此贴!帮忙阿! 菜鸟问题,请问怎么让 点主from上的一个按钮就弹出另一个编好的窗体 请问能不能将网页页面内容保存为word文档输出?? 碰上大麻烦了,哥们们救救我吧!~ 请看此帖,帮忙啊! 中文打包问题 谁可以给我一个java的例子读excel的*.cvs文件,thanks 请看此帖,帮忙啊! 想请叫一个关于网站视频的问题 关于jre的2个问题 oracle错误 Memo字段(Access)的字符串搜索问题? 在线等待啊,高分!!对选题的判分。 请看此帖,帮忙啊! 我是新手 不知学习前端软件开发哪种好(vb.net / pb /?????????) 高手救急!win2000/xp安装棘手问题!在线等 我的小猫怎摸找不到了呢? 菜鸟一问:一个关于生成类似VC中WorkSpace的一个问题,救命用啊~~~请大家帮忙!! 品牌权益(brand equity)和品牌价值(brand value)有什麽不衕?有什麼不同点? 关于英雄形像和秋天景色的成语 思维北征,宜先入南中思的意思 国庆阅兵观后感的题目60周年的,别太俗了,像《 》有感;国庆 有感……之类的.30分钟内回答!60周年的,别太俗了,像《 》有感;国庆 有感……之类的不要。30分钟内回答! 急需英语单句改错题答案,并讲解理由, 臣受命之日 寝不安席 食不甘味 成长在现代汉语大辞典中的含义 2009年双子座流星雨在美国能看到么?加州.俄勒冈那里 “故五月渡泸,深入不毛”涉及到什么事件? 方言与现代汉语的意义相比较,有什么不同 请问、2010年的双子座流星雨在广东韶关能看到吗?几号能看到最多? 五月渡泸,深入不毛与什么战役有关 赋课金翻译成国语白话是什么意思? 2011英语作文改错试题 用‘小时’作‘单位时间’行吗? Plant Physiology 是不是SCI 2009国庆阅兵读后感,300字到400字之间.要300到400字之间 电功率的时间单位是秒吗?100W的时间单位是小时吗? Plant Diseases and Pests是什么级别的杂志 09国庆阅兵读后感急死了 机械表是用什么方式对应时间单位:小时,和分钟的?如果说:时针从一个数字走到下一个数字经过的这个格子对应的是时间单位(一小时),那么分针同时间走的一圈是什么意思?如果再说:分 但愿人长久千里共婵娟,其中婵娟指的是什么? tourist products在有关旅游的英语文章中什么意思 西班牙语cuidarte el 英语翻译一个字,词语,短语翻译就好,能整段整段翻译自然最佳 products什么意思啊,英语真的实在不通了 要求初二水平 ,正方形ABCD中,边长为4,BE=1,P是线段AC上的以动点,当P在AC上运动是,PB+PE的最小值是多少? 第五题,下面那题不用做,求解答第五题, 英语广告:“Brand new w/warranty.”中的“w/”是什么意思?类似的还有:“Brown w/ ice maker.Excel.cond.Reasonably priced.”中的“w/”是什么意思? c 如何实现画抛物线 if you plant in soil,they growif you plant in soil,they grow为什么不是will grow? “但愿人长久,千里共婵娟”中的“婵娟”指的是什么? 关于鲁滨逊漂流记的读后感字数500 急! |这个符号怎么打,有人知道吗? 告诉下!谢谢! 但愿人长久,千里共婵娟中“婵娟”指什么 Brand products such as character是什么意思啊 选择合适的单词填空 do should grow plant soil A:what are you going to( )this sunday?B:l'm going to ( )a tree.A:How do you do that?B:lt's easy.First,dig the( ).put the tree in the soil.A:what( )you do then?B:water it.wait for it to( ) 帮我看看这改错题 One afternoon a girl set out in the coast in a small boat and was caught in a storm.答案说把in改成from,可这句话有另个in ,应该是该哪个呢? 2009国庆阅兵直播观后感600字要像初一写的 求一个点符号! 不是·不是丶不是• QAQ就是这个3右下角的点>>>⒊ 求啊求! 求英语,这是道改错题,每条都有错, 求解一道高数的定积分题目 sprout plant soil seed 哪个是与众不同的单词? 会议室座位安排领导10名,秘书1名,主持人1名,客人43名,大屏幕在门口那侧,如何安排座位? 因为男方连续多个月赌博,被女方发现赌博单据,并且事后还不承认错误,两人已经分居半年多,男方一直也没有诚意,以托时间为主,就是不同意离婚,还动手打人,辱骂女方,曾经说过:‘我就是不 什么牌子的微晶石好?超晶石和微晶石有什么区别? “第二故乡”英文怎么翻?、、RT、、 有一个与地面成30°角的斜坡,现要在斜坡上竖一电线杆,当电线杆与斜坡成( )度角时,电线杆与地面垂直.我同学都算得等于60°,我的疑惑是:为什么不能写120°?求大师解决 心驰神往 有一首英文歌曲,节奏很像凤凰传奇这首 心驰神往 叫什么名字 请帮解释一改错题 I was about to rush out of the train station when a well-dressed old man took me by my arm.“ Young lady,” said the gentleman,“Shouldn’t you find out the bus schedule before you rush out to catch the bus?”by my arm 出师表“五月渡泸,深入不毛”是三国演义中的什么故事 找一个符号【黑色的爱心】♥这个怎么打? 例:风景——流连忘返 问:英雄——( ) 五月渡泸,深入不毛,. 什么是Core_value_of_brand? If he hadn’t used his cellphone to make that SOS call ,all the passengers on boat would have left to die in the sea ,just like what happened to the people on the Titanic almost 100 years ago .would have left 改成would have been left为什么要 湿婆神发怒是什么意思 2009国庆阅兵观后感 取题目2009国庆阅兵的观后感~ 帮忙取个题目` 各位大哥大姐帮帮忙~ 急啊!10月9日要交啦、、谢 2009年双子座流星雨2009年的双子座流星雨大不大?我家在黑龙江黑河具体的观测时间和观测地点需不需要带什么?如果没有天文望远镜看得到嘛?我刚等完狮子座流星雨就感觉俩字:上当这次看 五月渡泸,深入不毛 指的是三国演义中的哪个故事 宁夏“10·14”灭门杀人案犯罪嫌疑中组部:干部离退休3年内不得到原管辖杭州一大妈在城市空地种2000余株罂中国网络媒体论坛宣言“让网络清朗”中航工业否认为2.7万名员工配备iP世界关注中国“关键性会议” 将为长远内罗毕火车与公交车相撞死伤数十人韩国议员呼吁韩朝积极合作解决开城问题印度长途巴士失火事故造成至少40人死刘延东会见美国英特尔公司首席执行官十八届三中全会将于11月9日至12日全国人大常委会五年立法规划公布 立法国际观察:监听丑闻凸显美国网络信息“美国国家情报总监暗示奥巴马绝对知道监美国情报总监称白宫早知晓监听 政府内李源潮会见欧洲客人李源潮会见欧洲客人全面深化改革 再创体制机制新优势“染缸”绍兴重手遏制纺织行业三大污染日本拟将钓鱼岛海域列入重点防御“灰色“刀锋战士”将面临检方提出的两项新指大运会万米光脚摘铜后 张莹莹半马带伤激流中那最后一刻(点赞中国·爱国、敬上半年淘汰老旧车17.8万辆网上消费贷款别随便乱花(理财参谋)为引领全球清洁能源发展的中国鼓掌(国读了二十年 还不想毕业(延伸阅读)中超第十八轮战罢 领跑四强无一掉队全国残疾人职业技能竞赛闭幕你有事 我跑腿(新气象 新生活)促进经济增长阶段平稳转换(人民要论)政策传真湖北:绿色“紧箍咒”倒逼发展转型小德战胜费德勒夺第九个大满贯冠军“苏满欧”让出口更便捷大运会万米光脚摘铜后 张莹莹半马带伤中东部多地遭遇高温吉祥图(中国画)海南乐东“变身记”愈开放,愈迷人应急演习暑期支教 欢乐课堂
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘