PB11.5创建的webservice为何update数据无更新?

nocry115 2016-07-07 07:05:43
请教各位达人:
  最近有个项目要求用WebService方法做接口,数据库是oracle9i;需要我方编写WebService函数让对方调用,让他们插入数据到约定的数据库中。目前,用PB11.5编写了WebService服务器端并Deploy生成WSDL,编写了个向测试表a_test中插入一条简单数据的函数,但insertrow之后update,返回值成功数据库实际却没有任何更新!请教原因何在?

//n_webservice的创建中已设置SQLCA连接oracle的各种参数
//函数 n_webservice.of_insert_test() ,返回string
//参数 string as_id

connect using SQLCA;

datastore lds_tmp
lds_tmp = create datastore
lds_tmp.dataobject = 'd_test'

lds_tmp.settransobject(SQLCA)
ii = lds_tmp.retrieve() //后台手工插入了1条,retrieve取值测试正确
//return string(ii)

string ls_id
ls_id = as_id

i = lds_tmp.insertrow(0)
lds_tmp.setitem(i, 'id',ls_id) //对应测试库表唯一主键ID,其他字段全可为null

if lds_tmp.update() = 1 then
commit using SQLCA;
else
ls_re = SQLCA.sqlerrText
rollback using SQLCA;
disconnect using SQLCA;
return ls_re
end if

disconnect using SQLCA;

return '0'
//IE打开...n_webservice.asmx测试调用成功返回字符串0,但实际表a_test无变化
...全文
531 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
nocry115 2016-07-12
  • 打赏
  • 举报
回复
引用 2 楼 sbks 的回复:
1.debug看整个作业中sqlca的状态,有可能本身数据库就没有连接好.最好的办法就是用到就连,用完就断.估计代码是托管于IIS,全局变量有被自动清理掉的可能. 2.为了能查看事件的参数创建一个datastore对象,设置几个实例变量,在该对象的event中记录参数值,最重要的event无非就是dberror,sqlpreview,itemerror然后你的代码用到的datastore对象继承于它,你就可以在你的代码里看到这些参数了,一般这些参数也会告诉你原因
更正: 调试时刚发现connect using SQLCA;后SQLCA.SQLCode = 0按理说是连上数据库了; 但是datastore.retrieve()我又手工插入1条记录共2条,返回值还是1! 难道说SQLCA.SQLCode = 0这个是误导?
nocry115 2016-07-12
  • 打赏
  • 举报
回复
引用 9 楼 nocry115 的回复:
[quote=引用 2 楼 sbks 的回复:] 1.debug看整个作业中sqlca的状态,有可能本身数据库就没有连接好.最好的办法就是用到就连,用完就断.估计代码是托管于IIS,全局变量有被自动清理掉的可能. 2.为了能查看事件的参数创建一个datastore对象,设置几个实例变量,在该对象的event中记录参数值,最重要的event无非就是dberror,sqlpreview,itemerror然后你的代码用到的datastore对象继承于它,你就可以在你的代码里看到这些参数了,一般这些参数也会告诉你原因
这次试了试建datastore标准不可视对象,声明datastore lds_tmp;deploy后运行webservice测试函数of_insert2test()出错了。 难道不支持datastore?(对了,电脑操作系统是XP SP3 32位的)信息如下: [/quote] 不好意思,datastore没问题,是我忘改了一句代码,正在查SQLpreview
nocry115 2016-07-12
  • 打赏
  • 举报
回复
引用 2 楼 sbks 的回复:
1.debug看整个作业中sqlca的状态,有可能本身数据库就没有连接好.最好的办法就是用到就连,用完就断.估计代码是托管于IIS,全局变量有被自动清理掉的可能. 2.为了能查看事件的参数创建一个datastore对象,设置几个实例变量,在该对象的event中记录参数值,最重要的event无非就是dberror,sqlpreview,itemerror然后你的代码用到的datastore对象继承于它,你就可以在你的代码里看到这些参数了,一般这些参数也会告诉你原因
这次试了试建datastore标准不可视对象,声明datastore lds_tmp;deploy后运行webservice测试函数of_insert2test()出错了。 难道不支持datastore?(对了,电脑操作系统是XP SP3 32位的)信息如下: System.Web.Services.Protocols.SoapException: 无法将类型为“Sybase.PowerBuilder.Web.PBDataStore”的对象强制转换为类型“c__n_datastore”。 ---> System.InvalidCastException: 无法将类型为“Sybase.PowerBuilder.Web.PBDataStore”的对象强制转换为类型“c__n_datastore”。 在 c__n_webservice.of_insert2test(PBString as_bm) 位置 e:\zingtech\webser11\pb2cstempout\webservice\n_webservice.of_insert2test(SS):行号 26 在 cns_webservice.PBWS__n_webservice.of_insert2test(String as_bm) 位置 e:\zingtech\webser11\pb2cstempout\webservice\webservice.asmx.cs:行号 126 --- 内部异常堆栈跟踪的结尾 --- 在 Sybase.PowerBuilder.Web.WebServices.PBWebService.HandleException(Exception ex) 在 cns_webservice.PBWS__n_webservice.of_insert2test(String as_bm) 位置 e:\zingtech\webser11\pb2cstempout\webservice\webservice.asmx.cs:行号 136
nocry115 2016-07-12
  • 打赏
  • 举报
回复
引用 7 楼 sbks 的回复:
检查你的sqlca.autocommit是否设置成false,只有设置成false,才可以在dw_1.update()之后,手动commit或rollback的操作才会生效
感谢你的回答! 这是n_webservice的constructor事件里设置的SQLCA属性: //// Profile nm_database SQLCA.DBMS = "O90 Oracle9i (9.0.1)" SQLCA.LogPass = "zing" + "tech" SQLCA.ServerName = "nm_local" SQLCA.LogId = "nmxs_database" SQLCA.AutoCommit = False 学习了你以前的帖子;我把VC++2012运行库删除了,重新安装了VC++2008运行库,重启后问题依旧
sbks 2016-07-12
  • 打赏
  • 举报
回复
检查你的sqlca.autocommit是否设置成false,只有设置成false,才可以在dw_1.update()之后,手动commit或rollback的操作才会生效
nocry115 2016-07-11
  • 打赏
  • 举报
回复
引用 3 楼 pcwe2002 的回复:
http://download.csdn.net/detail/pcwe2002/9563695 可以下载这个试试,使用restful方式直接写存储过程就可以提供数据。
WebService接口本身就支持不够好,如果还引入第三方控件将会更加糟糕,用户体验也不会很好啊。
nocry115 2016-07-11
  • 打赏
  • 举报
回复
引用 2 楼 sbks 的回复:
1.debug看整个作业中sqlca的状态,有可能本身数据库就没有连接好.最好的办法就是用到就连,用完就断.估计代码是托管于IIS,全局变量有被自动清理掉的可能. 2.为了能查看事件的参数创建一个datastore对象,设置几个实例变量,在该对象的event中记录参数值,最重要的event无非就是dberror,sqlpreview,itemerror然后你的代码用到的datastore对象继承于它,你就可以在你的代码里看到这些参数了,一般这些参数也会告诉你原因
1.数据库连接成功,测试过了;而且对datastore进行retrieve可以得到正确的值。 2.不太明白你的意思,但datastore.update()=1应该成功了啊,为何没变化呢? 是datastore的编辑状态未变?还是缺少WebService/IIS环境?或WebService服务器更新dw需要特别语法?
pcwe2002 2016-07-08
  • 打赏
  • 举报
回复
http://download.csdn.net/detail/pcwe2002/9563695 可以下载这个试试,使用restful方式直接写存储过程就可以提供数据。
sbks 2016-07-08
  • 打赏
  • 举报
回复
1.debug看整个作业中sqlca的状态,有可能本身数据库就没有连接好.最好的办法就是用到就连,用完就断.估计代码是托管于IIS,全局变量有被自动清理掉的可能. 2.为了能查看事件的参数创建一个datastore对象,设置几个实例变量,在该对象的event中记录参数值,最重要的event无非就是dberror,sqlpreview,itemerror然后你的代码用到的datastore对象继承于它,你就可以在你的代码里看到这些参数了,一般这些参数也会告诉你原因
nocry115 2016-07-07
  • 打赏
  • 举报
回复
//代码前补上变量声明 long i, ii

662

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder Web 应用
社区管理员
  • Web 应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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