51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 4455|回复: 23
打印 上一主题 下一主题

[原创] 关于LR动态调用数据库的小问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2010-3-1 10:29:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的是kerzhang大神曾经06年提出的动态调用的方法
原帖:
http://www.51testing.com/?uid-2327-action-viewspace-itemid-1539

我的部分代码为:
lr_load_dll("GetData.dll");
        i=init_db("DRIVER={Microsoft ODBC for Oracle};UID=***; PWD=***; SERVER=orcl02");
        if (i!=0)
        {
           lr_error_message("init db error");
           return -1;
        }//验证是否连接

        init_hstmt(&ll_hstmt);

        i+=execSQL("SELECT TOP 13 b.operatorrisksid,b.targetid FROM que_operatorrisks b");
        lr_output_message("i=%d",i);

        i+=bindCol(1,oper,"c",50,ll_hstmt);//绑定列
           lr_output_message("i=%d",i);
        i+=bindCol(2,targ,"c",20,ll_hstmt);
         lr_output_message("i=%d",i);

这里我遇到了困难
1.init_hstmt(&ll_hstmt)这个函数的作用是什么?我去判断其值时,始终不为0
2.bindCol()这个函数,几个参数分别应为什么?SQL中的列号,是指在数据库中的第几列么?

希望有高人指点~谢谢~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2010-3-1 10:58:58 | 只看该作者
这问题你要问这个DLL文件的作者了
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2010-3-1 10:59:00 | 只看该作者
由于kerzhang并没有给出具体的getdata.dll的代码,所以我在用的时候也是猜的

基本上我把查询语句定为一个返回属性时,可以正常使用
回复 支持 反对

使用道具 举报

该用户从未签到

4#
发表于 2010-3-1 11:01:36 | 只看该作者
bindCol(2,sp)
头两位是,第一位是返回的取值顺序,如果要第一列,写1,要第二列写2

第二个参数是返回的内容保存的变量名,其他不详
回复 支持 反对

使用道具 举报

该用户从未签到

5#
 楼主| 发表于 2010-3-1 11:11:50 | 只看该作者
谢谢答复~

但还是想麻烦说下“把查询语句定为一个返回属性时,可以正常使用”是什么意思?
因为我想将查询出的内容进行提取,并存入oper,targ这两个数组里面,在后面进行使用
能举个例子更好

另外关于bindCol()这个函数的第一个参数
是说无论我要取值是在数据库的任何一列,这头两个参数,分别都是1和2?
回复 支持 反对

使用道具 举报

该用户从未签到

6#
 楼主| 发表于 2010-3-1 11:12:18 | 只看该作者

回复 2# 的帖子

作者貌似隐退了。。我也没有办法。。
回复 支持 反对

使用道具 举报

该用户从未签到

7#
 楼主| 发表于 2010-3-1 11:13:58 | 只看该作者

回复 5# 的帖子

谢谢答复~

但还是想麻烦说下“把查询语句定为一个返回属性时,可以正常使用”是什么意思?
因为我想将查询出的内容进行提取,并存入oper,targ这两个数组里面,在后面进行使用
能举个例子更好

另外关于bindCol()这个函数的第一个参数
是说无论我要取值是在数据库的任何一列,这头两个参数,分别都是1和2?
回复 支持 反对

使用道具 举报

该用户从未签到

8#
发表于 2010-3-1 11:18:55 | 只看该作者
就是我直接写select 属性名 from 表,只有一个属性值返回没啥问题,而多个返回你可以写select * 用bindcol(属性编号 来解决

保存到数组默认不行,你要自己写个再赋值的过程就可以了

你取值的行是通过循环实现的,1,2是说明多个返回中第几个属性而已

其实我觉得动态调用数据库没啥用,我宁可写个别的东西来关联抓,方便
回复 支持 反对

使用道具 举报

该用户从未签到

9#
 楼主| 发表于 2010-3-1 11:42:56 | 只看该作者

回复 8# 的帖子

有点明白了~
是说对于我所写的sql语句
SELECT TOP 13 b.operatorrisksid,b.targetid FROM que_operatorrisks b
bindCol一个参数假如为1,则指向的是b.operatorrisksid这个列,如果为2,则指向b.targetid这个列?
最多能这样取几个列?
回复 支持 反对

使用道具 举报

该用户从未签到

10#
 楼主| 发表于 2010-3-1 12:01:21 | 只看该作者

回复 8# 的帖子

int i=0;
        int x=0;
        long ll_hstmt;
        char *a[100];
        char *b[100];
        char oper[50],targ[20];

        lr_load_dll("GetData.dll");
        i=init_db("DRIVER={Microsoft ODBC for Oracle};UID=**; PWD=** ; SERVER=**");
        if (i!=0)
        {
           lr_error_message("init db error");
           return -1;
        }

        i=init_hstmt(&ll_hstmt);
        i+=execSQL("SELECT TOP 13 b.operatorrisksid,b.targetid FROM que_operatorrisks b");
        lr_output_message("i=%d",i);

        i+=bindCol(1,oper,"c",50,ll_hstmt);
        i+=bindCol(2,targ,"c",20,ll_hstmt);

        while (i!=100)
        {
                i=fetchData(ll_hstmt);
                *a[x]=oper;
                *b[x]=targ;
                x++;
        }
        disConnect_hstmt(ll_hstmt);
        free(oper);
        free(targ);
        x=0;

这是我的完整代码,从数据库中取出,然后存入指针型数组a和b中~
但是我总觉得数组上的定义哪里有些问题
希望高人能为我指点一下~

[ 本帖最后由 cyk00 于 2010-3-1 17:50 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

11#
发表于 2010-3-1 14:31:15 | 只看该作者

回复 10# 的帖子

具体说明下函数:
init_hstmt(&ll_hstmt)这个函数的作用是什么?
bindCol()这个函数,几个参数分别应为什么?作用是什么?
回复 支持 反对

使用道具 举报

该用户从未签到

12#
发表于 2010-3-1 14:31:51 | 只看该作者

回复 1# 的帖子

帮你顶
回复 支持 反对

使用道具 举报

该用户从未签到

13#
 楼主| 发表于 2010-3-1 14:34:32 | 只看该作者

回复 11# 的帖子

这两个函数我也不是很清楚~你可以看看原帖,在本贴的开头我有写~
回复 支持 反对

使用道具 举报

该用户从未签到

14#
 楼主| 发表于 2010-3-1 14:40:34 | 只看该作者

回复 12# 的帖子

thx~~~
回复 支持 反对

使用道具 举报

该用户从未签到

15#
发表于 2010-3-1 14:43:07 | 只看该作者

回复 13# 的帖子

init_hstmt(&hstmt);?这个函数没写是什么意思
回复 支持 反对

使用道具 举报

该用户从未签到

16#
 楼主| 发表于 2010-3-1 14:46:19 | 只看该作者

回复 15# 的帖子

没写,但是主要用于断开数据库还是什么的~我现在可以连接上数据库了,但是没办法将数据进行复制出来~郁闷得很~

另外,我上面那段代码有好多处错误,暂时还是不要看了~
回复 支持 反对

使用道具 举报

该用户从未签到

17#
发表于 2010-3-1 14:50:30 | 只看该作者

回复 8# 的帖子

就是我直接写select 属性名 from 表,只有一个属性值返回没啥问题,而多个返回你可以写select * 用bindcol(属性编号 来解决

保存到数组默认不行,你要自己写个再赋值的过程就可以了

你取值的行是通过循环实现的,1,2是说明多个返回中第几个属性而已

其实我觉得动态调用数据库没啥用,我宁可写个别的东西来关联抓,方便

顶。。。。
但使用关联怎么弄呢?
回复 支持 反对

使用道具 举报

该用户从未签到

18#
 楼主| 发表于 2010-3-1 14:56:06 | 只看该作者

回复 17# 的帖子

你用这个方法成功了?
我就是在取值的时候出现了问题,啥值都没取出来
暂时也没找到原因

关联分为手动关联和自动关联,当你重跑脚本之后,在工具栏里面有专门的一条选项是建立关联
手动关联比较繁琐,但能准确性高,步骤为:
两次录制脚本,然后对比脚本(工具栏里也有这么一个选项)
找出不同的地方,然后判断左右边界,进行关联
具体的方法,在网上很多地方都能找到,你可以去搜索一下~
回复 支持 反对

使用道具 举报

该用户从未签到

19#
发表于 2010-3-1 15:00:52 | 只看该作者
原帖由 苏高跃 于 2010-3-1 14:50 发表
就是我直接写select 属性名 from 表,只有一个属性值返回没啥问题,而多个返回你可以写select * 用bindcol(属性编号 来解决

保存到数组默认不行,你要自己写个再赋值的过程就可以了

你取值的行是通过循环实现的 ...


我写个动态页面能够列出数据库里面的值,然后用lr做个关联出来就行了,我在kaixin网的脚本里面就用了类似的方式做出来的
回复 支持 反对

使用道具 举报

该用户从未签到

20#
 楼主| 发表于 2010-3-1 15:14:10 | 只看该作者

回复 19# 的帖子

我在fetchData(ll_hstmt)这个函数之后
进行了一次oper值的输出,但值为空~可能的原因有哪些?
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-10-7 18:28 , Processed in 0.090439 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表