Powerbuilder中实现用代码配置ODBC

cjt000000 2003-07-09 05:25:51
我在PB8中实现代码配置ODBC(数据库为ASA7。0) 在ODBC数据源测试连接成功但PB中却提示

SQLSTATE = IM002
[MICROSOFT][ODBC驱动程序 管理器]未发现数据源名称并且未指定默认驱动器程序


这是为什么?
...全文
85 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
kowloons 2003-07-10
  • 打赏
  • 举报
回复
嗯,很好,我的辛苦总算了有回报。
cjt000000 2003-07-10
  • 打赏
  • 举报
回复
分数如果分配的不公平,大家不要见怪。
cjt000000 2003-07-10
  • 打赏
  • 举报
回复
揭贴
kowloons 2003-07-10
  • 打赏
  • 举报
回复

//用代码配置ODBC,把dbodbc7.dll和dbeng7.exe放到当前目录下,注册数据源时要用。
//本代码已在高度通过。
//发布时只需要把PB所用的DLL放到当前目录下就可以在任何一台机器上运行了。
Int Answer
string ls_driver,ls_start,ls_location,db_path,ODBCStr
string db_name,db_password
db_name="test";db_password="123456" //此处修改数据库名和密码!

ls_Location=GetCurrentDirectory( )
if left(ls_Location,2)='\\' then //判断应用程序是否是直接访问网络!
messagebox('错误','此应用程序现是放在网络上,必须先映射网络驱动程序后方能使用!~n~n'+'请与网管联系。')
halt
end if

if right(ls_Location,1)='\' then ls_Location=Mid(ls_Location,1,2) //放在根目录下

ls_Driver=ls_Location+"\dbodbc7.dll"
ls_Start=ls_Location+"\dbeng7.exe"
IF Not (FileExists(ls_Driver) AND FileExists(ls_Start)) Then
MessageBox("错误","此电脑没有安装SYBASE SQL ANYWHERE 的驱动程序,系统将终止运行!",StopSign!)
halt
End IF

/*如果是第一次运行该系统,则注册数据源:为了保证应用程序只是在首次运行时注册数据源,可先在注册表建立一个键值。*/

//取得注册表中的“first”的值,first为路径字符串
string ls_first
RegistryGet("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\OptionalComponents\aosen","first",RegString!,ls_first)
//ls_first值不变,说明是初次运行该系统,进行注册

if ls_first<>ls_Location then
/****************************注册开始****************************/

//设置ODBC\ODBCINST.INI\ODBC DRIVERS
Answer=RegistrySet("HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\ODBC DRIVERS","AOSEN Sybase SQL Anywhere 7.0", RegString!, "Installed") //99
IF Answer = -1 Then
MessageBox("错误!","应用程序无法设置ODBC\ODBCINST.INI\ODBC DRIVERS,系统将终止运行!",Information!)
halt
End if

//设置ODBC\ODBCINST.INI\
Answer=0
Answer=Answer + RegistrySet("HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\AOSEN Sybase SQL Anywhere 7.0", "CPTimeout", RegString!, "not pooled") //99
Answer=Answer + RegistrySet("HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\AOSEN Sybase SQL Anywhere 7.0", "Driver", RegString!,ls_Driver)
Answer=Answer + RegistrySet("HKEY_LOCAL_MACHINE\Software\ODBC\ODBCINST.INI\AOSEN Sybase SQL Anywhere 7.0", "Setup", RegString!,ls_Driver)
IF Answer<>3 Then
MessageBox("错误!","应用程序无法设置ODBC\ODBCINST.INI,系统将终止运行!",Information!)
halt
End if

//设置ODBC DATA SOURCE名称
Answer=RegistrySet("HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\ODBC Data Sources", db_name, RegString!, "AOSEN Sybase SQL Anywhere 7.0") //99
IF Answer = -1 Then
MessageBox("错误!","应用程序无法设置ODBC DATA SOURCE名称,系统将终止运行!",Information!)
halt
End if

//设置ODBC.ini细节
db_path=ls_Location + '\' + db_name + '.db' //数据库所在地
Answer=0
Answer=Answer + RegistrySet("HKEY_LOCAL_MACHINE\software\odbc\odbc.ini\" + db_name, "Autostop", Regstring!, "yes")
Answer=Answer + RegistrySet("HKEY_LOCAL_MACHINE\software\odbc\odbc.ini\" + db_name, "DataBaseFile", Regstring!, db_path)
Answer=Answer + RegistrySet("HKEY_LOCAL_MACHINE\software\odbc\odbc.ini\" + db_name, "Description", Regstring!, "我的数据库")
Answer=Answer + RegistrySet("HKEY_LOCAL_MACHINE\software\odbc\odbc.ini\" + db_name, "Driver", Regstring!, ls_Driver)
Answer=Answer + RegistrySet("HKEY_LOCAL_MACHINE\software\odbc\odbc.ini\" + db_name, "start", Regstring!, ls_Start)
Answer=Answer + RegistrySet("HKEY_LOCAL_MACHINE\software\odbc\odbc.ini\" + db_name, "Integrated", Regstring!, "NO")
Answer=Answer + RegistrySet("HKEY_LOCAL_MACHINE\software\odbc\odbc.ini\codeodbc", "UID", Regstring!, "dba")
Answer=Answer + RegistrySet("HKEY_LOCAL_MACHINE\software\odbc\odbc.ini\codeodbc", "PWD", Regstring!, "sql")



IF Answer <>6 then
MessageBox("错误!","应用程序无法设置ODBC.INI细节,系统将终止运行!",Information!)
halt
End if

//写入注册表中的“first”键值,避免下次运行时再次注册数据源
Answer=RegistrySet("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\OptionalComponents\aosen","first",Regstring!,ls_Location)
IF Answer = -1 Then
MessageBox("错误!","应用程序无法设置判断值ls_first,系统将终止运行!",Information!)
halt
End if

/****************************注册尾****************************/

end if


ODBCStr='dsn=' + db_name + ';databasename=' + db_name + ';databasefile=' + db_path
sqlca.dbms="odbc"
sqlca.database=db_name

sqlca.dbparm="connectstring='" + ODBCStr +";uid=dba;pwd=" + db_password +" '"
SQLCA.AutoCommit = False
connect using sqlca;
if sqlca.sqlcode<>0 then
messagebox("连接失败","对不起!数据库连接失败"+sqlca.sqlerrtext)
halt
end if


open(w_userlogin)
Jingxh 2003-07-09
  • 打赏
  • 举报
回复
up
runsoft 2003-07-09
  • 打赏
  • 举报
回复
应该是你的代码写的有问题。上面写的已经很全了
cjt000000 2003-07-09
  • 打赏
  • 举报
回复
我先在ODBC数据源配置一个数据源。在注册表中查到注册信息。然后在PB8中照着写的。就出现上面的问题了。
bomber2001 2003-07-09
  • 打赏
  • 举报
回复
错了,应该是这个http://expert.csdn.net/Expert/topic/2003/2003515.xml?temp=.4515955
回复人: thinkinger(只剩浪漫)
一。自动配置数据源(否则在控制面板中手动进行配置)

1.数据源信息在注册表里存储有两处:(以ctmep数据源为例)
HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ctemp
和 HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources

2.自定义窗口函数
wf_set_registryvalues
(string reg_keyname,string reg_valuename,string reg_value)
其中reg_keyname 在注册表中增加的键名
reg_valuename 该键值下的值名
reg_value 该值名下的值

3.函数实现:
int reg_result
reg_resulet=RegistrySet(reg_(Keyname,reg_valuename,RegString!,reg_value)
if reg_resulet<>1 then
MessageBxo("错误信息","操纵键值错误!")
end if

4 //下面以建立名为Library的数据源为例
string ls_keyname
string ls_valuename
string ls_value
//第一步为HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources增加Library值
ls_keyname="HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\ODBC Data Sources"
ls_valuename="LIbrary"
ls_value="Sybase SQL Anywhere 5.0"
wf_set_registryvalues(ls_keyname,ls_valuename,ls_vaue)

//第二步为HKEY_CURRENT_USER\Software\ODBC\ODBC.INI 增加Library键
RegistrySet("第二步为HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\Library","","")

//第三步为HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\Library 键增加值
ls_keyname="HKEY_CURRENT_USER\Software\ODBC\ODBC.INI\Library"
ls_valuename="AutoStop"
ls_value="yes"
wf_set_registryvalues(ls_keyname,ls_valuename,ls_vaue)

ls_valuename="DatabaseFile"
ls_value="C:\chf_pb\library.db"
wf_set_registryvalues(ls_keyname,ls_valuename,ls_vaue)

ls_valuename="DatabaseName"
ls_value="Library"
wf_set_registryvalues(ls_keyname,ls_valuename,ls_vaue)

ls_valuename="Description"
ls_value="Library Database source,1999"
wf_set_registryvalues(ls_keyname,ls_valuename,ls_vaue)

ls_valuename="Driver"
ls_value="C:\sqlany50\win32\wod50t.dll"
wf_set_registryvalues(ls_keyname,ls_valuename,ls_vaue)

ls_valuename="PWD"
ls_value="sql"
wf_set_registryvalues(ls_keyname,ls_valuename,ls_vaue)

ls_valuename="Start"
ls_value="C:\Program Files\PowerSoft\DDDK6\ODBC DRIVERS\dbeng50.exe"
wf_set_registryvalues(ls_keyname,ls_valuename,ls_vaue)

ls_valuename="UID"
ls_value="dba"
wf_set_registryvalues(ls_keyname,ls_valuename,ls_vaue)

---------------------------------------------------------------

以下希望对你有所帮助
PB中如何利用API函?列出所有ODBC?据源

首先,你必??明如下三?外部函?:
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
bomber2001 2003-07-09
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2003/2003515.xml?temp=.9868128
will521 2003-07-09
  • 打赏
  • 举报
回复
你先在注册表中找到你配好的ODBC键值,把它记录下来,在程序运行时把这些相应的值再写入注册表,我都是这么做的。祝你好运!!!
hzhxxx 2003-07-09
  • 打赏
  • 举报
回复
你 search 一下,多的是啊

主要是读写注册表

1,075

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧