在PowerBuider中动态注册ODBC数据源

Author: 曹琳 Date: 2000年 第43期

  PowerBuilder(以下简称PB)作为客户端的数据库应用开发工具,一般要与数据库服务器结合起来开发客户机/服务器体系的应用。而通过ODBC连接到数据库是PB存取数据的重要方式。为了简化程序的安装,方便用户的使用,分发到用户手中的PB应用程序必须能够完成对ODBC数据源的动态注册。
  在PB中,可以使用其自身的注册(Registry)函数、安装程序制作软件“InstallShield”、Windows的API函数等,完成对ODBC数据源的动态注册。其中,PB自身的注册(Registry)函数具有简单、易于修改和控制的特点,同时也便于开发者理解和掌握。本文就以此方法为例,说明在PB中如何动态注册ODBC数据源。
#1  一、ODBC数据源在Windows注册表中注册的项目
  为了完成对ODBC数据源的注册,要在注册表中进行以下注册:
  1.将数据源名称注册到“HKEY_CURRENT_USER\software\odbc\odbc.ini\odbc data sources”下。
  2.“HKEY_CURRENT_USER\software\odbc\odbc.ini”下新增以该数据源名称为键名的子键,并在此键下添加连接数据源所需要的参数。这些参数包括所连接数据库的位置、文件名称(databasefile)、启动数据库的命令文件(start)、pwd、uid等。需要注意的是,不同数据库系统所需的参数并不相同,我们可以通过以下方法得到某一具体数据源的参数:首先在PB中通过手工设置,连接到数据源,然后运行注册表编辑程序(Regedit.exe),查看“HKEY_CURRENT_USER\software\odbc\odbc.ini”下,以该数据源名称为键名的子键中的值,这里的内容就是我们所需要的数据源的连接参数。
#1  二、使用PB的注册函数
  PB中使用“RegistrySet()”函数在注册表中设置或创建指定的键,以下是该函数语法及参数。
  语法:
  RegistrySet ( key, valuename, valuetype, value )
  参数:
  key:string类型,指定键名;
  valuename:string类型,指定要访问值的名称。每个键可以有一个未命名的值和多个命名的值。要访问未命名的值,把该参数指定为空字符串(″″)。如果注册库中不存在指定值名,该函数将创建新的值名;
  valuetype:RegistryValueType枚举类型,指定值的数据类型,这里我们选用“regstring!”;
  value:要设置的值,其数据类型应该与valuetype参数指定的类型相匹配。
  返回值:Integer型。函数执行成功时返回1,失败时返回-1。
#1  三、应用实例
  假设我们连接到“sybase sql anywhere 5.0”创建的本地数据库“c:\pb\ex.db”,数据源名称为“ex”。
  /*如果是第一次运行该系统,则注册数据源:为了保证应用程序只是在首次运行时注册数据源,需要在程序的工作目录下创建一个INI文件,该文件包含“start”小节,其中建立“first=1”*/
  integer rc
  //取得INI文件中“start”小节 “first”的值
  rc=profileint(″first.ini″,″start″,″first″,1)
  //rc=1则是初次运行该系统,进行注册
  if rc=1 then
  /*将数据源名称“ex”注册到“HKEY_CURRENT_USER\software\odbc\odbc.ini\odbc data sources”下。*/
  registryset(″HKEY_CURRENT_USER\software\odbc\odbc.ini\odbc data sources″,″ex″,regstring!,″sybase sql anywhere 5.0″)
  /*“HKEY_CURRENT_USER\software\odbc\odbc.ini”下新增以该数据源名称“ex”为键名的子键,*/
  registryset(″HKEY_CURRENT_USER\software\odbc\odbc.ini\ex″,″″,regstring!,″″)
  //创建连接到数据源所需要的参数
  registryset(″HKEY_CURRENT_USER\software\odbc\odbc.ini\ex″,″autostop″,regstring!,″yes″)
  registryset(″HKEY_CURRENT_USER\software\odbc\odbc.ini\ex″,″databasefile″,regstring!,″c:\pb\ex.db″)
  registryset(″HKEY_CURRENT_USER\software\odbc\odbc.ini\ex″,″databasename″,regstring!,″ex″)
  registryset(″HKEY_CURRENT_USER\software\odbc\odbc.ini\ex″,″driver″,regstring!,″wod50t.dll″)
  registryset(″HKEY_CURRENT_USER\software\odbc\odbc.ini\ex″,″pwd″,regstring!,″sql″)
  registryset(″HKEY_CURRENT_USER\software\odbc\odbc.ini\ex″,″start″,regstring!,″dbeng50 -Q″)
  registryset(″HKEY_CURRENT_USER\software\odbc\odbc.ini\ex″,″uid″,regstring!,″dba″)
  /*设置INI文件中“start”小节的“first=0”,避免下次运行时再次注册数据源*/
  setprofilestring(″first.ini″,″start″,″first″,″0″)
  end if
  将以上代码加入应用对象的open事件中,执行程序即可完成ODBC数据源的注册。
  代码中为了更好地说明registryset()函数的使用,将连接的数据库固定在“c:\pb”目录下。在具体应用中,可以使用外部函数“GetCurrentDirectoryA()”得到当前目录,与数据库文件名合并为一个字符串变量后,以该变量注册″databasefile″的值,就实现了真正的动态注册ODBC数据源,这里不再赘述。