亲哥们,高手都在说把连接数据源写到程序里,菜鸟都在找,能给个例子吗?

gui41021 2009-07-30 11:48:30
MYSQL连PB 不用用户配置数据源 装了驱动运行直接连库 看高手们说能通过在程序里写代码或者写注册表实现

能给个例子吗,估计需要的人不少 我用完帮着传播一下 普及下基础知识吧!!

连上给分 (*^__^*) 嘻嘻……
...全文
48 点赞 收藏 6
写回复
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
WorldMobile 2009-07-30


pb中用代码配置ODBC

在编写PB(PowerBuild)的Windows应用程序中,常常涉及到数据库的配置,特别是网络数据库的配置,通常基于网络的应用程序发行需要手工设置ODBC。本文介绍一种代码配置的方法可以免去在进行单机或网络数据库应用程序时进行手工配置ODBC的烦琐。PowerBuilder是功能强大的客户端开发工具,它的优势在于数据库应用程序的开发,所以绝大部分应用必须与数据库管理系统配合起来才能运行。OBDC是一种编程接口,它能使应用程序访问以结构化查询语言(SQL)作为数据访问标准的数据库管理系统。PB与数据库的连接可以通过ODBC接口实现,在ODBC中配置好数据源后,便可在程序代码中连接数据库并对数据库进行各种操作了。配置ODBC的方法主要有三种:手工配置、代码自动配置和通过安装程序(如InstallShield等专业安装程序)自动配置。大部分PB资料对手工配置ODBC均作了介绍,在这里主要介绍在代码中进行ODBC的配置的方法。第三种方法可以参考InstallShield等软件的使用说明。
原理

Windows中所有的ODBC数据源在系统注册表中都有记载,因此只要编写相应的代码对注册表中的项目进行相应的修改即可。Windows中与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 记录各种数据源的详细信息。


只要打开Windows 95(Windows 98、Windows NT4或Windows 2000)菜单“开始”,然后单击“运行”,输入Regedit运行注册表程序,在注册表中选择左边的树结构,查找上述相应的选项,就可以看到其中的详细信息。

我们只要在代码中对这些键进行配置,便可达到配置ODBC的目的。

实现

下面以PowerBuilder 7.0 内置的Sybase SQL Anywhere 6.0数据库为例介绍ODBC的代码配置方法。

1、打开注册表,找到数据库驱动程序及相关文件

首先找到相应的数据库驱动程序,这些文件可以在注册表的HKEY_LOCAL_MACHINE\Software

\ODBC\ODBCINST.INI下相应键中找到。如Sybase SQL Anywhere 6.0为dbeng60.exe,Wod60t.dll,以及一些其他相关的动态链接库,此例中为Dbl60t.dll、Wl60ent.dll、Wtr60t.dll、Wodbc.gid和Wtr60t.dll。这些文件必须与最终的可执行程序一起安装到用户的计算机上。它们可以与应用程序放在一起,也可以放在一个特定的目录下(本例为Windows 98的System目录下)。在调试时可先将这些文件复制到指定的目录下。

2、在应用程序中用PB脚本代码配置ODBC

在应用的Open事件中对ODBC配置的脚本代码如下:

Ulong ul_num;
Int li_sysdir,li_dir1,li_dir2,li_dir3,li_dir4,li_dir5,li_app;
String ls_driver,ls_start,ls_location,ls_apppath,ls_dbpath,ls_odbcstr;
//获取操作系统的system目录,并保存到ls_location变量
li_sysdir = RegistryGet(″KYEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Setup″,″SysDir″,RegString!ls_location);
IF li_sysdir = -1 THEN
Messagebox(′错误′,′应用程序无法获取Windows的系统目录,系统将终止运行d,Stopsign!);
RETURN;
END IF
//判断Sybase SQL Anywhere6.0的驱动程序是否正确安装
ls_driver = ls_location+′\WOD60T.DLL′
ls_start = ls_location+′\dbeng60.EXE′
IF NOT (FileExists(ls_driver) AND FileExists(ls_start)) THEN
Messagebox(′错误′,′系统中没有安装SQL Anywhere 6.0的驱动程序,系统将终止运行d,StopSign!);
RETURN;
END IF
//设置ODBC\ODBCINST.INI\ODBC DRIVERS
li_sysdir=RegistrySet(′HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\ODBCDRIVER′,′Sybase SQL Anywhere 6.0′,RegString!,′Installed′);
IF li_sysdir = -1 THEN
Messagebox(′错误′,′应用程序无法设置ODBC DRIVERS,系统将终止运行d,StopSign!);
RETURN;
END IF
//设置ODBC\ODBCINST.INI
li_dir1=RegistrySet(′HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\Sybase SQL Anywhere 6.0′,′CPTimeout′,RegString!,′not pooled′)
li_dir2=RegistrySet(′HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\Sybase SQL Anywhere 6.0′,′Driver′,RegString!,ls_driver)
li_dir3=RegistrySet(′HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\Sybase SQL Anywhere 6.0′,′Setup′,RegString!,ls_driver)
IF li_dir1=-1 OR li_dir2=-1 OR li_dir3=-1 THEN
Messagebox(′错误′,′应用程序无法设置ODBCINST.INI,系统将终止运行d,StopSign!);
RETURN;
END IF
//设置ODBC DATA SOURCE(MyDataSource为数据源名)
li_sysdir=RegistrySet(′HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\ODBC Data Sources′,′MyDataSource′,RegString!,′Sybase SQL Anywhere 6.0′);
IF li_sysdir=-1 THEN
Messagebox(′错误′,′应用程序无法设置ODBC DATA SOURCE,系统将终止运行d,StopSign!);
RETURN;
END IF
//获取应用程序的安装路径(MyApp为应用程序安装到用户计算机上后在注册表中注册的应用程序名,MyDatabase.db为应用程序的数据库名,与应用程序在同一目录下,MyDataSource为数据源名)
li_app=RegistryGet(″KYEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Paths\MyApp″,″Path″,RegString!ls_apppath)
IF li_app=-1 THEN
Messagebox(′错误′,′应用程序无法获取程序安装路径名,系统将终止运行d,StopSign!);
RETURN
ELSE
ls_dbpath=ls_apppath+′MyDatabase.db′;
END IF
//设置ODBC.INI
li_dir1=RegistrySet(′HKEY_current_user\software\odbc\odbc.ini\MyDataSource′,′driver′,RegString!,ls_driver);
li_dir2=RegistrySet(′HKEY_current_user\software\odbc\odbc.ini\MyDataSource′,′start′,RegString!,ls_start);
li_dir3=RegistrySet(′HKEY_current_user\software\odbc\odbc.ini\MyDataSource′,′autostop′,RegString!,′yes′);
li_dir4=RegistrySet(′HKEY_current_user\software\odbc\odbc.ini\MyDataSource′,′DataBaseFile′,RegString!,ls_db_path);
li_dir5=RegistrySet(′HKEY_current_user\software\odbc\odbc.ini\MyDataSource′,′DataBaseName′,RegString!,′MyDatabase′);
IF li_dir1=-1 OR li_dir2=-1 OR li_dir3=-1 OR li_dir4=-1 OR li_dir5=-1 THEN
Messagebox(′错误′,′应用程序无法设置ODBC.INI,系统将终止运行!′,StopSign!);
RETURN
END IF
ls_odbcstr=′dsn=MyDataSource;databasename=MyDatabase;databasefile=′+ls_dbpath;
sqlca.dbms=′odbc′;
sqlca.databse=′MyDatabase′;
sqlca.dbparm=″connectstring=′ ″+ls_odbcstr+″;uid=dba;pwd=sql′ ″;
connect using sqlca;
open(w_frame);


该程序在Windows 98 中用PowerBuilder 7.0 调试通过。



回复
WorldMobile 2009-07-30
转一个access,应该都差不多

powerbuilder 自动注册odbc用户数据源(使用access数据库)2008-03-21 09:15/* powerbuilder开发程序一般需要在客户的"裸机"上注册odbc数据源(如果使用odbc数据源链接数据库)。此时不能让客户手动管理工具-->odbc数据源,这些操作应该对客户是透明的,所以需要程序中自动注册odbc数据源。本程序参考了网络上的一些自动注册odbc数据源的程序,自己观察了手动建立odbc数据源前后注册表表项的变化情况,然后利用查看和更改注册表的2个函数对注册表的相关条目进行操作,成功自动注册odbc数据源。程序给出了较清晰的注解,希望方便以后需要的朋友。

程序中可变的部分也相应以可变给出标记。*/


//自动注册odbc数据源(对access数据库)
string dsn //odbc数据源名
string database //access数据库
string currentPath //当前路径
string odbcDriver //odbc驱动
string myOdbc //程序目录中包含odbcjt32.dll驱动

currentPath = getCurrentDirectory()
if right(currentPath, 1) <> "\" then
currentPath = currentPath + "\"
end if
dsn = "autohardware" //数据源名可变
database = currentPath + "autoHardWare.mdb" //数据库文件可变
myOdbc = currentPath + "odbcjt32.dll" //提前把odbcjt32.dll放在程序目录中

/*此处可以添加一段程序:检查系统目录是否包含odbcjt32.dll,如果没有包含把
提前准备好的odbcjt32.dll拷贝到系统目录下

否则,程序认为用户的操作系统目录下包含odbcjt32.dll
*/ //此处请完美者添加,在pb中调用windows api得到系统目录,目前程序默认windows系统安装在C盘

//odbc驱动文件必须放在系统目录下
odbcDriver = "c:\windows\system32\odbcjt32.dll"
//检查用户机子上是否已经安装了本程序所需的数据源(名为autohardware)
int ret
string result
string regEditKey
regEditKey = "HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\" +dsn
string regOdbcSources
regOdbcSources = "HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources"
//registryget(key, 数据,数据类型, 存放结果)
ret = registryget(regEditKey, "DBQ", RegString!, result)
if ret = 1 then
goto label //label标记,连接数据库,打开窗口,自己可以改动

else
//注册用户数据源
//registrySet(key, 数据,数据类型,值)
registrySet(regEditKey, "DBQ", RegString!, database)
registrySet(regEditKey, "Driver", RegString!, odbcDriver)
registrySet(regEditKey, "DriverId", ReguLong!, 25)
registrySet(regEditKey, "FIL", RegString!, "MS Access")
registrySet(regEditKey, "UID", RegString!, "") //用户名可以自己设置,此处设置为空
registrySet(regEditKey, "PWD", RegString!, "") //密码可以自己设置,此处设置为空
registrySet(regEditKey, "SafeTransactions", ReguLong!, 0)
//下面这行程序把该用户dsn添加到odbc dsn列表中,即管理工具添加数据源的"可见性"
registrySet(regOdbcSources, dsn, RegString!, "Microsoft Access Driver(*.mdb)")
goto label //label标记,连接数据库,打开窗口,自己可以改动
end if

回复
woshilitao5 2009-07-30
補充下:
我是用一個全局函數注冊的odbc,該函數返回的是odbc別名。之后怎么用不用我說啦吧?
還有某些pb的函數不懂的自己查一下!
回复
woshilitao5 2009-07-30
自己領悟下,以下是ini文件的內容(';'號表示注釋!):
;這是記錄ODBC信息的ini文件

[CreateODBC]
;以下都是CreateODBC 節的屬性

;是否重新注冊:
IsRegistry=yes

;ODBC別名(DSN):
DatasourceName=demo_bill

;資料庫文件名稱:
DatabaseFile=billdb.db

;驅動程式名稱(如果系統已經有相同名稱的驅動程式,則自動選擇該驅動程式,否則就從driver屬性中獲取):
DriverName=AnyWhere 7.0

;驅動文件:
Driver=dbodbc7.dll

;資料庫登陸帳號
Uid=dba

;資料庫登陸密碼
pwd=sql

回复
woshilitao5 2009-07-30
[b]我自己寫的一個列子,建議先了解odbc的工作流程,以及系統注冊表屬性的意思![/b]
//用程式注冊 ODBC連接
integer li_ispass //是否執行函數成功
string ls_databasefile_current //當前系統注冊表中的databasefile屬性值
string ls_db_path //記錄當前target application所在的路徑

string ls_dsn //odbc別名
string ls_IsRegistry //是否重新注冊odbc
string ls_databaseFile //資料庫文件名稱
string ls_driverName //ODBC驅動程式名稱(系統回自動根據此名稱去找相關的驅動)
string ls_driver //ODBC驅動
string ls_uid //登陸帳號
string ls_pwd //登陸密碼

ls_db_path = GetCurrentDirectory() //獲得當前 target application所在的路徑

//從ini文件中讀取DSN
ls_IsRegistry = profilestring(ls_db_path + '\database\sys.ini','CreateODBC','IsRegistry','yes')
ls_dsn = profilestring(ls_db_path + '\database\sys.ini','CreateODBC','DatasourceName','billdb')
ls_databaseFile = profilestring(ls_db_path + '\database\sys.ini','CreateODBC','DatabaseFile','billdb.db')
ls_driverName = profilestring(ls_db_path + '\database\sys.ini','CreateODBC','DriverName','Adaptive Server Anywhere 7.0')
ls_driver = profilestring(ls_db_path + '\database\sys.ini','CreateODBC','Driver','dbodbc7.dll')
ls_uid = profilestring(ls_db_path + '\database\sys.ini','CreateODBC','Uid','dba')
ls_pwd = profilestring(ls_db_path + '\database\sys.ini','CreateODBC','pwd','sql')

/*
以下用于從系統注冊表中的odbc數據源節中取出key值為billdb的value
billdb:指要從系統注冊表中取出值的key名稱,這里也表示ODBC名稱
RegString! 是registryRegStrin類型的枚舉,表示取出 以空字符結束的字符串
*/

if ls_IsRegistry = "yes" then //ini文件設定要重新注冊odbc時
//以下 先注冊odbc的名稱再注冊相關的屬性
if registryset("HKEY_CURRENT_USER\software\odbc\odbc.ini\odbc data sources", ls_dsn ,regstring!, ls_driverName) > 0 then
registryset("HKEY_CURRENT_USER\software\odbc\odbc.ini\" + ls_dsn ,"AutoStop",regstring!,"yes")
registryset("HKEY_CURRENT_USER\software\odbc\odbc.ini\" + ls_dsn ,"Driver",regstring!, ls_db_path + "\database\" + ls_driver)
registryset("HKEY_CURRENT_USER\software\odbc\odbc.ini\" + ls_dsn ,"pwd",regstring!, ls_pwd)
registryset("HKEY_CURRENT_USER\software\odbc\odbc.ini\" + ls_dsn ,"uid",regstring!, ls_uid)
registryset("HKEY_CURRENT_USER\software\odbc\odbc.ini\" + ls_dsn ,"Integrated",regstring!,"no")

registryset("HKEY_CURRENT_USER\software\odbc\odbc.ini\" + ls_dsn ,"DatabaseFile",regstring!, ls_db_path + "\database\" + ls_databaseFile)
else
messagebox('提示','注冊ODBC失敗!')
halt close
end if
end if
return ls_dsn
回复
gui41021 2009-07-30
谢谢两位大哥,因为MYSQL有乱码问题么,所以配置ODBC时勾选了MYSQL几个参数,不知道这两个在注册表里是怎么体现的 不过意思我明白了 我按照这个方法把全部属性都取出来自己比较下哪个是我需要的吧。辛苦
回复
发动态
发帖子
数据库相关
创建于2007-09-28

730

社区成员

PowerBuilder 数据库相关
申请成为版主
社区公告
暂无公告