80
最 新 评 论
80
专 题 分 类
80
最 新 日 志
80
最 新 留 言
80
搜 索
用 户 登 录
友 情 连 接
我 的 好 友
80
博 客 信 息
80


Delphi 2005 如何动态设置ODBC数据源 | 2007/7/16 7:33:00
参考一下:  
  在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
阅读全文 | 回复(0) | 引用通告 | 编辑 | By: 皮皮爸爸
  • 标签:Delphi 
  • 发表评论:

      大名:
      密码: (游客无须输入密码)
      主页:
      标题:
      80
    Powered by Oblog.