• 动态注册ODBC数据源的通用方法


    本文以在Delphi 5.0中利用程序,动态生成并注册ODBC数据源为例,说明了一种通用的动态注册ODBC数据源的方法。此种方法实现简单,不但适用于Delphi,也适用于其它Windows下的开发工具。

    一、引言

      ODBC是微软于1993年推出的开放性数据库接口标准,它为不同数据库产品的访问和操作提供了一个统一的解决方案。作为一个开放标准,Windows平台下的许多数据库开发工具都支持通过ODBC方式来存取数据,如:Visual C++,PowerBuiler等。其它,如Borland的Delphi虽然通过BDE(Borland Database Engine)方式来访问数据,但ODBC配置的数据源,在BDE中也可以正确识别和使用。

      一般,ODBC数据源的配置是通过Windows控制面板中ODBC管理器手工设置完成的,这一点给程序安装人员和用户都带来了许多不便。对用户来说,程序安装应该越简单越好。因此,对程序就提出了能够根据安装环境,自动注册所需ODBC数据源的要求。虽然,关于动态注册ODBC数据源的实现方法已屡见不鲜,但大多只适用于某种确定的开发工具和环境,且实现复杂,操作不便。经笔者试验,找到了一条简单有效而通用的配置ODBC数据源的方法。

      实现原理: 通过导出开发环境下注册表中ODBC数据源信息到一注册表文件中,将所导出内容作为应用程序中的字符串常量进行保存。在程序运行时,如果发现ODBC数据源未正确注册,则根据环境信息和该字符串常量动态确定正确的注册表文件内容,并写入一临时注册表文件中;利用批处理文件将该文件中ODBC数据源信息导入系统注册表中,从而实现ODBC数据源的动态注册。

    二、操作步骤

      1.运行注册表编辑器程序(Regedit.exe)。

      2.导出注册表中\HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources下数据源名称信息到Reg1.reg文件中。注:该路径下存放的是用户定义的数据源信息,如果需要系统数据源信息,则可导出HKEY_Local_Machine\Software\ODBC.INI\ODBC Data Sources到注册文件中。

      3.导出要注册的数据源名称的具体连接参数信息到db2.reg中。在此,以导出名称为“PostMdb”的数据为例,具体路径: \HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\PostMdb。

      4.用文本编辑器如(NotePad.exe)打开上述db1.reg文件,保留数据源名称为PostMdb的行;并将db2.reg文件内容与当前db1.reg内容合并。假设修改后“PostMdb”数据源注册信息如下:

      REGEDIT4

      [HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources]

      ″PostMdb″=″Microsoft Access Driver (*.mdb)″

      [HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\PostMdb]

      ″Driver″=″C:\\WINDOWS\\SYSTEM\\ODBCJT32.DLL″

      ″DBQ″=″c:\\My Documents\\db1.mdb″

      ″Description″=″Post Card Mis Database″

      ″DriverId″=dword:00000019

      ″FIL″=″MS Access;″

      ″SafeTransactions″=dword:00000000

      ″UID″=″″

      [HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\PostMdb\Engines]

      [HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\PostMdb\Engines\Jet]

      ″ImplicitCommitSync″=″″

      ″MaxBufferSize″=dword:00000800

      ″PageTimeout″=dword:00000005

      ″Threads″=dword:00000003

      ″UserCommitSync″=″Yes″

      5.动态注册ODBC数据源的实现

      从上述注册信息可以看出,对于特定的数据源来说,实际上要动态确定的只是“Driver”和“DBQ”两项内容。将“Driver”=“C:\\WINDOWS\\SYSTEM\\ODBCJT32.DLL”修改为“Driver”=“%s\\ODBCJT32.DLL”,将“DBQ”=“c:\\My Documents\\db1.mdb”修改为“DBQ”=“%s\\db1.mdb”。复制修改后的注册信息到程序单元中存储为一字符串常量,命名为OdbcStr。以下以Delphi为例说明实现方法。

      为便于说明,假设主窗体名称为Form1,通过一命令钮Button1注册ODBC数据源。具体根据读者需要自行设定。

      procedure TForm1.Button1Click(Sender: TObject);

      var

       I :Integer;

       J :double;

       RegF :TextFile;

       SysDir: PChar;

       AppPath, Params, Path, DbPath: string;

       begin

       try

        //生成注册用的批处理文件

        Params := ′Regedit/s tmp.reg′; //批处理文件内容

        AppPath := ExtractFilePath(Application.ExeName); //取得应用程序当前路径

        AssignFile(RegF, AppPath + ′Reg.Bat′); //指定批处理文件路径和名称

        ReWrite(RegF); //创建和打开指定的文本文件

        WriteLn(RegF, Params); //将注册命令批处理内容写入文件

        CloseFile(RegF);

        //生成注册表文件

        GetMem(SysDir, 255);

        GetSystemDirectory(SysDir, 255);  //取得Windows系统目录

        Path := String(SysDir);

        Path := InsertSplash(Path); //将类似C:\WINDOWS\SYSTEM变为C:\\WINDOWS\\SYSTEM

        Delete(AppPath, Length(AppPath), 1); //将字符串尾部′\′字符删除

        DbPath := InsertSplash(AppPath); //取得数据库存放路径

        Params := Format(OdbcStr, [Path, DbPath]);

        AssignFile(RegF, AppPath + ′Tmp.Reg′);

        ReWrite(RegF);

        WriteLn(RegF, Params);

        CloseFile(RegF);

        //通过Api函数执行reg.bat, Uses中加入对ShellApi的引用

        If ShellExeCute(Application.Handle, ′Open′,′Reg.bat′, ′′, PChar(AppPath), SW_HIDE) <= 32

         then

       Showmessage(′导入注册表文件信息失败′);

       finally

       FreeMem(SysDir);

       end;

       end;

        上述代码调用了一字符串处理函数InsertSplash,用于将路径字符串中所有的′\′处理为′\\′;这样做是必需的,否则,上述注册信息DRIVER和DBQ项无法正确注册。InsertSplash函数代码如下:

      function InsertSplash(AStr: string): string; //需要在单元公有部分进行函数声明

      var

      I : Integer;

      begin

        For I := 1 to Length(AStr) do

      case AStr[I] = ′\′ of

      True : Result := Result + ′\\′;

        False: Result := Result + AStr[I];

       end;

      end;

    三、结束语

    通过上述操作可以看出,实现ODBC数据源的动态注册并没有通过Delphi特有的功能去完成,而只是通过文件读写功能,根据具体安装环境,生成ODBC数据源注册信息和批处理文件,以完成ODBC数据源的注册。这种实现方法不依赖于某种特定的开发工具,不需要通过手工进行ODBC数据源的配置,具有通用性强和操作简单的特点。而且,用上述同样的方法,读者也可编写能够注册其它类型数据源的程序,甚至,写成ODBC注册动态连接库,以利于程序复用。

  • 相关阅读:
    20191105 《Spring5高级编程》笔记-第10章
    Overview of the High Efficiency Video Coding (HEVC) Standard阅读笔记
    web视频播放
    ffmpeg使用笔记
    ffplay使用笔记
    ffmpeg安装配置以及库调用
    ffmpeg入门
    Faster-RCNN
    OJ练习
    python搭建友盟以及个推推送web服务器
  • 原文地址:https://www.cnblogs.com/martian6125/p/9631528.html
Copyright © 2020-2023  润新知