求教:如何获取系统ODBC用户和系统数据源名称.

dejingli 2004-03-26 03:27:05
我想用一个下拉式列表控件得到系统ODBC用户和系统数据源名称,和数据源驱动名称等信息,由用户来选择.
另外如何在自己编的程序中建立数据源.
感激不禁
...全文
289 点赞 收藏 1
写回复
1 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
sincerity 2004-03-26
取出有两种方法

1、其实ODBC数据源的信息都在注册表里。
修改这里的东西就行了∶
HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INIHKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI
2、用系统的API也行
首先,你必须声明如下三个外部函数:
FUNCTION integer SQLAllocEnv(ref long henv) LIBRARY "odbc32.dll"
FUNCTION integer SQLFreeEnv(long henv) LIBRARY "odbc32.dll"
FUNCTION integer SQLDataSources(long henv,integer idirection,ref string szdsn,int idsnmax,ref integer idsn,ref string szdesc,integer idescmax,ref integer idesc) library "odbc32.dll"
然后利用已经声明好的API函数读取ODBC数据源(dsn,数据库类型):
long ll_henv
string ls_dsn, ls_desc
integer li_direction, li_dsnmax, li_dsnlen, li_descmax, li_desclen, li_rc
integer li_length = 255

ls_dsn = Space(li_length)
li_dsnmax = li_length
ls_desc = Space(li_length)
li_descmax = li_length
IF SQLAllocEnv(ll_henv) = -1 THEN
MessageBox("错误", "调用SQLAllocEnv函数失败!")
ELSE
li_direction = 1
DO WHILE SQLDataSources (ll_henv, li_direction, ls_dsn, li_dsnmax, li_dsnlen, ls_desc, li_descmax, li_desclen) = 0 ddlb_1.AddItem(ls_dsn + " [" + ls_desc + "]") //ddlb_1是用于存放数据源的下拉式列表框
LOOP
SQLFreeEnv(ll_henv)
END IF

自己创建ODBC数据源,写注册表信息就行,给你个例子∶

Powerbuilder中实现用代码配置ODBCPowerbuilder中实现用代码配置ODBC
一、 引言
Powerbuilder是客户端的开发工具,在实际应用中必须与数据库管理系统配合起来才能运行应用程序,它与数据库的连接可以通过ODBC接口实现。在ODBC中配置好数据源后,便可在程序代码中连接数据库并对数据库进行各种操作了。目前的大部分PB参考书都只介绍了ODBC的手工配置方法,而没有介绍如何在代码中进行ODBC的配置,这样当程序最终完成并分发到用户手中后,还需要为用户配置ODBC,显得既麻烦又不符合专业软件的要求。那么,怎样才能在代码中实现对ODBC的配置呢?其实,Windows中所有的ODBC数据源在系统注册表中都有记载,因此只要对注册表中的项目进行相应的修改即可。与ODBC相关的键中,HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\ODBCDRIVER中记录了所有已安装的ODBC驱动程序;HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI中记录了各种ODBC驱动程序的相关信息;HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC
Data
Sources记录了各种数据源的类型;HKEY_CURRENT_USER\Software\ODBC\ODBC.INI则记录了各种数据源的详细信息。因此,只要在代码中对这些键进行配置,便可达到手工配置ODBC的目的。

二、在代码中配置ODBC的实现
下面以Powerbuilder内置的Sybase SQL Anywhere5.0数据库为例介绍ODBC的代码配置方法。
1、 找出数据库驱动程序及相关文件
首先找到相应的数据库驱动程序,这些文件可以在注册表的HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI下相应键中找到。如Sybase
SQL
Anywhere5.0为dbeng50.EXE,WOD50T.DLL,以及一些其他相关的动态链接库,此例中为Dbl50t.dll,Wl50ent.dll,Wtr50t.dll,Wodbc.gid,Wtr50t.dll。这些文件必须与最终的可执行程序一起安装到用户的计算机上,可以与应用程序放在一起,也可以放在一个特定的目录下(本例为Windows的system目录下)。在调试时可先将这些文件复制到指定的目录下。
2、 在程序中用代码配置ODBC
在应用的open事件中对ODBC配置的代码如下:
Ulong ul_num
Int answer,answer1,answer2,answer3,answer4,answer5,ansapp
String ls_driver,ls_start,ls_location,apppath,db_path,odbcstr
//获取操作系统的system目录,并保存到ls_location变量
answer=RegistryGet(“KYEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Setup”,”SysDir”,RegString!ls_location)
IF answer=-1 THEN
Messagebox(‘错误’,’应用程序无法获取Windows的系统目录,系统统将终止运行!’,Stopsign!)
RETURN
END IF
//判断Sybase SQL Anywhere5.0的驱动程序是否正确安装
ls_driver=ls_location+’\WOD50T.DLL’
ls_start=ls_location+’\dbeng50.EXE’
IF NOT (FileExists(ls_driver) AND FileExists(ls_start)) THEN
Messagebox(‘错误’,’系统中没有安装SQL Anywhere的驱动程序,系统将终止运行!’,StopSign!)
RETURN
END IF
//设置ODBC\ODBCINST.INI\ODBC DRIVERS
answer=RegistrySet(‘
HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\ODBCDRIVER’,’Sybase SQL
Anywhere 5.0’,RegString!,’Installed’)
IF answer=-1 THEN
Messagebox(‘错误’,’应用程序无法设置ODBC DRIVERS,系统将终止运行!’,StopSign!)
RETURN
END IF
//设置ODBC\ODBCINST.INI answer1=RegistrySet(‘ HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\Sybase
SQL Anywhere 5.0’,’CPTimeout’,RegString!,’not pooled’)
answer2=RegistrySet(‘ HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\Sybase
SQL Anywhere 5.0’,’Driver’,RegString!,ls_driver)
answer3=RegistrySet(‘ HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\Sybase
SQL Anywhere 5.0’,’Setup’,RegString!,ls_driver)
IF answer1=-1 OR answer2=-1 OR answer3=-1 THEN
Messagebox(‘错误’,’应用程序无法设置ODBCINST.INI,系统将终止运行!’,StopSign!)
RETURN
END IF
//设置ODBC DATA SOURCE名称(anysql为数据源名)
answer=RegistrySet(‘ HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\ODBC
Data Sources’,’anysql’,RegString!,’Sybase SQL Anywhere 5.0’)
IF answer=-1 THEN
Messagebox(‘错误’,’应用程序无法设置ODBC DATA SOURCE名称,系统将终止运行!’,StopSign!)
RETURN
END IF
//获取应用程序的安装路径(ybinput为应用程序安装到用户计算机上后在注册表中注册的应用程序名,yibiao.db为应用程序的数据库名,与应用程序在同一目录下,anysql为数据源名)
ansapp=RegistryGet(“KYEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App
Paths\ybinput”,”Path”,RegString!app_path)
IF ansapp=-1 THEN
Messagebox(‘错误’,’应用程序无法获取安装路径名,系统将终止运行!’,StopSign!)
RETURN
ELSE
db_path=app_path+’yibiao.db’
END IF
//设置ODBC.INI的细节
answer1=RegistrySet(‘HKEY_current_user\software\odbc\odbc.ini\anysql’,’driver’,RegString!,ls_driver)
answer2=RegistrySet(‘HKEY_current_user\software\odbc\odbc.ini\anysql’,’start’,RegString!,ls_start)
answer3=RegistrySet(‘HKEY_current_user\software\odbc\odbc.ini\anysql’,’autostop’,RegString!,’yes’)
answer4=RegistrySet(‘HKEY_current_user\software\odbc\odbc.ini\anysql’,’DataBaseFile’,RegString!,db_path)
answer5=RegistrySet(‘HKEY_current_user\software\odbc\odbc.ini\anysql’,’DataBaseName’,RegString!,’yibiao’)
IF answer1=-1 OR answer2=-1 OR answer3=-1 OR answer4=-1 OR answer5=-1 THEN
Messagebox(‘错误’,’应用程序无法设置ODBC.INI细节,系统将终止运行!’,StopSign!)
RETURN
END IF
odbcstr=’dsn=anysql;databasename=yibiao;databasefile=’+db_path
sqlca.dbms=’odbc’
sqlca.databse=’yibiao’
sqlca.dbparm=”connectstring=’”+odbcstr+”;uid=dba;pwd=sql’”
connect using sqlca;
open(w_main)
该程序在Powerbuilder6.0下运行通过。



回复
相关推荐
发帖
PowerBuilder
创建于2007-09-28

866

社区成员

PowerBuilder 相关问题讨论
申请成为版主
帖子事件
创建了帖子
2004-03-26 03:27
社区公告
暂无公告