急!在线等!为什么pb连不上SQL Server数据库,连SQL Server自带的master都连不上

io567n 2005-05-03 11:01:37
我在为公司调试程序,是一个已经写好的源代码,但就是连不上数据库,用odbc建立数据源后,用data profile怎么也连不上,即使是sql自带的master也连不上。改代码是用注册表来进行数据库的连接

注册表设置如下:
"ServerName"="isc001\isc"
"LogId"="sa"
"LogPass"="isc007"
"DBMS"="MSS Microsoft SQL Server 6.x"
"DATABASE"="nosecmis"
"AdminId"="23022222"
"AdminName"="郑可逵"
"IdMark"="2302"
"IdLen"="4"
"HelpFile"=""
"Warp"="8"
"AppDirectory"="D:"


读取注册表的代码如下:

这是取得注册表信息的函数gf_get_reg_info():
us_reg lus_reg
string ls_temp
//取的注册表的各项信息
string ls_reg_path //注册表信息的路径
ls_reg_path='HKEY_LOCAL_MACHINE\Software\ISC\rsmis\'
//取得服务器的名称
registryget(ls_reg_path,"ServerName",regstring!,lus_reg.ss_servername)
//取得服务器登录用户的名称
registryget(ls_reg_path,"LogId",regstring!,lus_reg.ss_logid)
//取得登录口令
registryget(ls_reg_path,"LogPass",regstring!,lus_reg.ss_logpass)
//取得DBMS的名称
registryget(ls_reg_path,"DBMS",regstring!,lus_reg.ss_dbms)
//取得数据库的名称
registryget(ls_reg_path,"DATABASE",regstring!,lus_reg.ss_database)
//系统管理员id
registryget(ls_reg_path,"Adminid",regstring!,lus_reg.ss_adminid)
//系统管理员name
registryget(ls_reg_path,"Adminname",regstring!,lus_reg.ss_adminname)

//账号补码
registryget(ls_reg_path,"IdMark",regstring!,lus_reg.ss_Idmark)
//账号录入码的长度
registryget(ls_reg_path,"IdLen",regstring!,ls_temp)
lus_reg.si_Idlen=integer(ls_temp)

//HELP文件的名称
registryget(ls_reg_path,"HelpFile",regstring!,lus_reg.ss_helpfile)



return lus_reg



这是连接函数gf_set_profile(ius_reg):
//根据从注册表得到的信息,设置连接参数
transaction l_trans
us_host lus_host
///////////////////////////
lus_host=gf_get_host_info()
/////////////////////////
l_trans=create transaction

l_trans.DBMS = aus_reg.ss_dbms
l_trans.Database = aus_reg.ss_database
l_trans.LogPass = aus_reg.ss_logpass
l_trans.ServerName =aus_reg.ss_servername
l_trans.LogId = aus_reg.ss_logid
l_trans.AutoCommit = false

l_trans.DBParm = "AppName='Rsmis(ISC Design)'"+",Host='"+w_p_login.sle_account.text+"\"+trim(lus_host.ss_name)+"'"

return l_trans



这是登录窗体中用户名文本框的modified()函数

//根据注册表提供的连接信息,连接到数据库
//连接数据库
integer li_exist//判断账号是否存在
string ls_mask,ls_text,ls_account
integer li_len
string ls_use_mark //可用标志

ius_reg=gf_get_reg_info()
sqlca=gf_set_profile(ius_reg)
connect using sqlca;
long ll_account//用户账号的数量
string ls_password
if sqlca.sqlcode<>0 then
messagebox("错误","数据库连接错误,请重新启动,或与系统管理员联系!")
halt;
else
.........

请各位大侠帮帮忙,指点一下小妹吧,过完五一要交的!!!
...全文
330 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
aichangfeng 2005-05-05
  • 打赏
  • 举报
回复
先看看在控制板是否可以
join123myhao 2005-05-03
  • 打赏
  • 举报
回复
不至于把,ODBC怎么可能连上SQL那证明你的SQL有问题了
princelily 2005-05-03
  • 打赏
  • 举报
回复
现帮你顶!再好好看看,嘿嘿
princelily 2005-05-03
  • 打赏
  • 举报
回复
我下午仔细看了你的问题,基本上明白了程序的思路,真的好麻烦啊,把连接数据库的参数写在系统注册表中的例子到时看了不少,就是没有看过(sqlca=gf_set_profile(ius_reg)//这么用法很奇怪啊!)。
我只能给你一些找出问题的建议,你要在PB下Debug,由于是通过RegistryGet()函数得到系统注册表中对应键值的值,所以说明原先就已经通过某种方式把你要的信息写入到注册表中了,你核对一下'HKEY_LOCAL_MACHINE\Software\ISC\rsmis\'路径下是否都有你要得到的键,核对完毕,再通过Debug单步走,检查是否把这些注册表中的信息得到了并写入了相应结构对象实例的元素中,如果成果了,那就离大功告成不远了。
由于你是通过一个函数中自定义事务处理对象(l_trans,注意你可没有Destroy l_trans释放这个自定义事物处理对象啊!),函数通过返回一个事务处理对象来传递给SQLCA,我说过,我从来没有见过这样写的,不知道调试的时候能不能使sqlca.sqlcode =0 ,建议放弃这种作法,写的执白一些不是坏事。直接给SQLCA的属性赋值,可靠性强些。
我不是PB的专家,只不过通过自己的一些经验给你一些帮助建议。由于是写入注册表,所以别人不能帮你调试,就要考你自己了。也不知道你的目的是什么?这个程序是你写的么?如果就是单纯的运行软件,连接上数据库,那就干脆写最简单的连接语句,不要这么复杂,我们最终要连接上数据库并运行软件不是么?
我们一般连接数据库的方法不外乎有以下几种方法,可能不是很全。

1、用最简单的连接配置数据库的语句来连接数据库。就是首先在ODBC数据源管理器中手工配置好数据源,在PB的Data Profiles中建立数据源配置文件,并连接上数据源后测试连接成功,并把配置代码粘贴到application对象的open事件中。如:
/* Profile jwc_app:建立与MSS Microsoft SQL Server 6.x建立的数据库jwc的连接*/
SQLCA.DBMS = "MSS Microsoft SQL Server"
SQLCA.Database = "jwc"
SQLCA.LogPass = "123"
SQLCA.ServerName = "(local)"
SQLCA.LogId = "sa"
SQLCA.AutoCommit = False
SQLCA.DBParm = ""

CONNECT USING SQLCA;

2、把配置连接信息写入.ini文件,.ini文件内容如下:
[DBMS_PROFILES]
Profiles=jwc_app
[Profile jwc_app]
DBMS=MSS Microsoft SQL Server
Database=jwc
UserId=
DatabasePassword=
LogId=sa
LogPassword=123
ServerName=(local)
DBParm=
Lock=
Prompt=FALSE
AutoCommit=FALSE

application对象的open事件中通过ProfileString()函数得到.ini文件中对应键值并放入SQLCA的对应属性中。这样做的好处是可以脱离PB编程环境改变数据库的配置信息,只需要用写字板打开.ini文件改动配置即可。

3、在application对象的open事件中,通过Registryget()函数得到注册表中指定键值,并放入SQLCA的对应属性中。这样做的好处是可以通过一些打包软件如:(InstallShield、InstallWise),通过软件的向导帮助你对注册表指定键值进行建立,修改,一气呵成。但也需要考虑到操作系统的路径问题。

就先说到这吧,希望你能得到高手的满意的解答。如果有问题,可以给我发消息留言。嘿嘿
嘘嘘兔 2005-05-03
  • 打赏
  • 举报
回复
建议 在函数gf_set_profile中设置断点看看传过来的值是否正确

1,077

社区成员

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

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