LoadRunner动态访问Oracle数据库+多协议录制解决方案[转载]
默认分类 2010-06-12 09:44:19 阅读73 评论0 字号:大中小 订阅
一、LoadRunner9.0动态访问Oracle数据库
#include "lrd.h"
static LRD_INIT_INFO lnitlnfo = {LRD_INIT_INFO_EYECAT};
static LRD_DEFAULT_DB_VERSION DBTypeVersion[] = {{LRD_DBTYPE_NONE,LRD_DBVERSION_NONE}};
//这里的LRD_VAR_DESC数据结构声明是很重要的,他是用来存储sql结果数据集的结构体,第一个参数头文件中就是这么写的,第二个参数是最 大行数,第三个参数是每一行的最大长度,如果获得的查询结果比定义的长,运行时就会报错,提示列被截断,最后一个参数是查询结果的类型,可以再帮助中的索引输入data types, database,列出的表格中是各种变量类型的名称
static LRD_VAR_DESC OBJECT_NAME_D1;
static LRD_VAR_DESC NUM ={LRD_VAR_DESC_EYECAT, 10, 32, LRD_DBTYPE_ORACLE, {1, 1, 0},DT_LONG_VARCHAR};
//定义初始化数据库的各种变量
static void FAR * OraEnv1;
static void FAR * OraSvc1;
static void FAR * OraSrv1;
static void FAR * OraSes1;
static void FAR * OraStm1;
static void FAR * OraDef1;
static unsigned long uliFetchedRows;
unsigned long rownum;
//初始化数据库
lrd_init(&lnitlnfo, DBTypeVersion);
lrd_initialize_db(LRD_DBTYPE_ORACLE,3,0);
lrd_env_init(LRD_DBTYPE_ORACLE, &OraEnv1,0,0);
lrd_ora8_handle_alloc(OraEnv1,SVCCTX,&OraSvc1,0);
lrd_ora8_handle_alloc(OraEnv1,SERVER,&OraSrv1,0);
lrd_ora8_handle_alloc(OraEnv1,SESSION,&OraSes1,0);
//连接数据库,我的是oracle,odbc中连接数据库名称就是这个
lrd_server_attach(OraSrv1,"数据库名",-1,0,0);
lrd_ora8_attr_set_from_handle(OraSvc1,SERVER,OraSrv1,0,0);
//用户名和密码
lrd_ora8_attr_set(OraSes1,USERNAME,"用户名",-1,0);
lrd_ora8_attr_set(OraSes1,PASSWORD,"密码",-1,0);
//初始化连接session
lrd_ora8_attr_set_from_handle(OraSvc1,SESSION,OraSes1,0,0);
//开始连接数据库
lrd_session_begin(OraSvc1,OraSes1,1,0,0);
lrd_ora8_handle_alloc(OraEnv1,STMT,&OraStm1,0);
//设定sql语句
lrd_ora8_stmt(OraStm1, "select XXX from XXX", 1, 0, 0);
//执行sql语句,并且将结果行数返回到rownum中
lrd_ora8_exec(OraSvc1, OraStm1, 0, 0,&rownum, 0, 0, 0, 0, 1);
//绑定该列
lrd_ora8_bind_col(OraStm1,&OraDef1,1,&NUM,0,0);
//设定保存列中的某个数据到row中,第二个参数为第几列,第三个参数为第几行(只能保存一个值),最后一个参数就是你想要保存到的parameter名称
lrd_ora8_save_col(OraStm1, 1, 1, 0, "resu1");
lrd_ora8_fetch(OraStm1, -2, 2, &rownum, 0, 2, 0, 0);
lr_error_message("sql result: %s", lr_eval_string("{resu1}"));
//释放连接数据库的各种变量
lrd_handle_free(&OraStm1, 0);
lrd_session_end(OraSvc1, OraSes1, 0, 0);
lrd_server_detach(OraSrv1, 0, 0);
lrd_handle_free(&OraEnv1, 0);
(1)首先要安装oracle客户端,通过客户端连接oracle数据库。如果不装数据库客户端会报错,如下:illegal character `/0241'
(2)写访问oracle数据库的脚本用oracle(2-tier)+web协议新建脚本,否则执行时会报错,如下:Error -- Unresolved symbol : lrdfnc_init
然后将录制的脚本拷到写好的访问oracle数据库脚本中。
(3)数据库连接不上
Action.c(47): Error: lrdo_server_attach: "OCIServerAttach" return-code=OCI_ERROR, error-code=12154:
Action.c(47): Error: ORA-12154: TNS: 无法解析指定的连接标识符
Action.c(47): server_attach: ERROR, return-code=LRDE2009. ServerHandle=OraSrv1, ServerID="XXXX"
(4)sql语句错误,报如下错误
Action.c(81): Error: lrdo_ora8_fetch: "OCIStmtFetch" return-code=OCI_ERROR, error-code=24338:
Action.c(81): Error: ORA-24338: 未执行语句句柄
Action.c(81): lrd_ora8_fetch: ERROR, return-code=LRDE2009. StmtHandle=OraStm1, 0 row(s) fetched
(5)如果用controller执行涉及好的脚本报如下错误:you do not have a license for this vuser type please contact mercury interactive to renew your license
解决方案:原因是由于目前使用的License不支持Socket场景运行,将License替换一下就可以了。
使用的License也就是目前网络上比较通用的两个:
global 100user:AEAMAUIK-YAFEKEKJJKEEA-BCJGI
10000 web clients:AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB
一开始使用的10000 web clients的,出现该问题,后来替换成global 100 user 就可以了。具体视情况而定。
二、多协议录制脚本,协议web(http/html),ie打开后没有反应了
在recording options中advanced里选择support charset utf-8
三、多协议录制脚本,协议web(http/html),ld根本没反应
修改ie设置,工具-高级,把启动第三方浏览器扩展(需要重启动)
四、单协议录制脚本,系统中有些东西出不来
原因:客户端安装了插件,插件会向服务器发送请求