游闲子

------尽自己的努力,做到最好...

  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  27 随笔 :: 0 文章 :: 9 评论 :: 0 Trackbacks
最近在公司搞loadrunner脚本,需要访问数据库取一个动态值,在网上看到的一个是通过loadrunner的parameters自动生成一个表格,但这个东西是静态的,不会随着脚本的运行而变化,还有就是大神kernzhang流传的getdata.dll,但是执行sql无法获得结果,他的个人主页也打不开了-_-!!!无法得到源码,根本不知道咋用。

  #include<lrd.h>
  static LRD_INIT_INFO InitInfo={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 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;
  unsigned long rownum;

  vuser_init()
  {
  //初始化数据库  
  lrd_init(&InitInfo,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,"db_192.168.0.101",-1,0,0);
  lrd_ora8_attr_set_from_handle(OraSvc1,SERVER,OraSrv1,0,0);

  //用户名和密码
  lrd_ora8_attr_set(OraSes1,USERNAME,"eeim2",-1,0);
  lrd_ora8_attr_set(OraSes1,PASSWORD,"eeim2",-1,0);
  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);
  return 0;
  }

  Action()
  {
  //这里写上你的sql语句(我主要是需要查询的结果,如果你是插入或修改记录就不用往后看了)
  lrd_ora8_stmt(OraStm1,"select R_V from ce_receviablecharge where user_no = 2009070901",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, "result");

  //这个遍历刚才查询的结果,第二个参数0表示就1行,负号表示遍历所有结果,绝对值表示实际有多少行,第三个参数表示一次遍历最大进行多少行(不能大于LRD_VAR_DESC中定义的第二个参数,即最大行数)
  lrd_ora8_fetch(OraStm1, -2, 2 &rownum, 0, 2, 0, 0);

  //这里我用error是为了看得醒目,不要认为是出错了
  lr_error_message("sql result: %s", lr_eval_string("{result}"));
  return 0;
  }

  vuser_end()
  {
  lrd_session_end(OraSvc1, OraSes1, 0, 0);
  lrd_server_detach(OraSrv1, 0, 0);
  lrd_handle_free(&OraEnv1, 0);
  return 0;
  }

  最后通过lrd系列的函数解决了这个问题,现在跟大家分享一下!!!它是基于odbc访问数据库的原理,主要的东西除了在帮助中,还有就是看看lrd.h中的定义说明。

  到此就结束了,但是这个东西目前我只是支持取出一个结果放到parameter中,还搞不懂如和将所有数据放入parameter中,来作为自动化时多用户使用的参数。在此抛砖引玉,希望有达人能够解决!!!

  另外要注意的是,如果你是录制了一个http协议的脚本,那么编译时无法通过的,需要创建一个odbc和http协议的混合脚本写入这些代码,然后再创建一个http脚本进行录制,然后将http中录制的脚本内容拷贝过来。俺也不知道为什么,如果我先录制脚本再插入这些代码总是提示lrd_init()未知错误:

  vuser_init.c(19): Error: C interpreter run time error: vuser_init.c (19):  Error -- Unresolved symbol : lrdfnc_init.

  vuser_init.c(19): Notify: CCI trace: Compiled_code(0): vuser_init()

  这个东西后来我将sql语句进行了参数化,这样可以保证每个模拟的用户得到不同的值(别忘了在参数中选择Unique)。关联也可以取得这些参数,但是我那个录制的脚本中无法自动关联,手动关联只有调出所有日志,才能找到服务器发送的参数,一次20分钟……而且长时间运行有时候会偶尔出现找不到参数信息,怀疑是由于发送消息超时的原因。

  使用数据库会造成数据库服务器的负荷,如果进行数据库测试,建议使用关联,否则可能影响服务器性能。

版权声明:本文为51Testing论坛会员圣炬骑士原创,http://bbs.51testing.com

转载请保留链接,标明本文原始出处、作者信息和本声明,否则将追究法律责任。

posted on 2009-07-30 16:20 枫晰落扬 阅读(578) 评论(2)  编辑 收藏 引用 所属分类: 性能测试

评论

# re: LoadRunner9.0动态访问Oracle数据库 2009-08-01 11:10 99读书人
不错啊  回复  更多评论
  

# re: LoadRunner9.0动态访问Oracle数据库 2009-08-04 12:25 凡客诚品
十六大开发商的  回复  更多评论
  

只有注册用户登录后才能发表评论。