转-LoadRunner动态访问Oracle数据库+多协议录制解决方案

上一篇 / 下一篇  2011-03-01 10:37:05 / 个人分类:LoadRunner

一、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设置,工具-高级,把启动第三方浏览器扩展(需要重启动)

四、单协议录制脚本,系统中有些东西出不来
    原因:客户端安装了插件,插件会向服务器发送请求


TAG:

 

评分:0

我来说两句

Open Toolbar