转-LoadRunner获取数据库中内容并参数化【已验证】
上一篇 / 下一篇 2011-03-02 13:50:21 / 个人分类:LoadRunner
工作上有使用LoadRunner时又需要到数据库中取相应的数据作为参数,经过一番折腾及验证代码如下
运行成功条件:需安装oracle客户端,且设置了odbc连接,否则会报错illegal character `\0241'
Action()
{
#include "lrun.h"
#include "vdf.h"
#include "print.inl"
#include "lrd.h"
//code by shiwanli----------参数定义
unsigned long rownum;
char Temp[200];
char Prem_value[200];
//code by shiwanli----------以下两行为结构声明,在绑定时使用,如果不声明则会报错
//code by shiwanli----------LRD_VAR_DESC数据结构声明是很重要的,他是用来存储sql结果数据集的结构体
//code by shiwanli----------第二个参数,设置结果集中最大行数,在lrd_ora8_fetch中的第二个参数如果大于该值,则会报错。
//code by shiwanli----------第三个参数,设置结果集中每一行的最大长度,如果获得的查询结果比定义的长,运行时就会报错,提示列被截断
//code by shiwanli----------最后一个参数是查询结果的类型,可以再帮助中的索引输入data types, database,列出的表格中是各种变量类型的名称
//code by shiwanli----------常用的数据类型有DT_VARCHAR, DT_DECIMAL, DT_DATETIME, DT_SF, DT_SZ, DT_NUMERIC
static LRD_VAR_DESC NUM ={LRD_VAR_DESC_EYECAT, 10, 32, LRD_DBTYPE_ORACLE, {1, 1, 0},DT_LONG_VARCHAR};
static LRD_VAR_DESC NUM1 ={LRD_VAR_DESC_EYECAT, 10, 32, LRD_DBTYPE_ORACLE, {1, 1, 0},DT_LONG_VARCHAR};
static LRD_VAR_DESC OBJECT_NAME_D1;
static LRD_INIT_INFO InitInfo = {LRD_INIT_INFO_EYECAT};
static LRD_DEFAULT_DB_VERSION DBTypeVersion[] = {{LRD_DBTYPE_NONE,LRD_DBVERSION_NONE}};
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;
//code by shiwanli----------初始化数据库
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);
//code by shiwanli----------连接数据库,这里数据库服务名为lisx
lrd_server_attach(OraSrv1, "lisx", -1, 0, 0);
lrd_ora8_attr_set_from_handle(OraSvc1, SERVER, OraSrv1, 0, 0);
//code by shiwanli----------设定数据库用户名密码checker
lrd_ora8_attr_set(OraSes1, USERNAME, "checker", -1, 0);
lrd_ora8_attr_set(OraSes1, PASSWORD, "checker", -1, 0);
//code by shiwanli----------初始化连接session
lrd_ora8_attr_set_from_handle(OraSvc1, SESSION, OraSes1, 0, 0);
//code by shiwanli----------开始连接数据库
lrd_session_begin(OraSvc1, OraSes1, 1, 0, 0);
lrd_ora8_handle_alloc(OraEnv1, STMT, &OraStm1, 0);
//code by shiwanli----------设定查询语句
lrd_ora8_stmt(OraStm1, "select sum(prem) from lccont where prtno='120010100000470' \n", 1, 0, 0);
//code by shiwanli----------执行查询语句
//code by shiwanli----------第三个参数,执行次数
//code by shiwanli----------第四个参数,跳过记录数
//code by shiwanli----------第五个参数,返回执行影响的行数
//code by shiwanli----------第九个参数,设置执行模式,0是默认值执行(不提交),16不执行,32代表执行且自动提交
//code by shiwanli----------第十个参数,设置警告级别,0是默认值,代表错误,1代表警告
lrd_ora8_exec(OraSvc1, OraStm1, 0, 0,&rownum, 0, 0, 0, 0, 1);
//code by shiwanli----------绑定该列
lrd_ora8_bind_col(OraStm1,&OraDef1,1,&NUM,0,0);
//code by shiwanli----------绑定第二列 lrd_ora8_bind_col(OraStm1,&OraDef2,2,&NUM1,0,0);
//code by shiwanli----------设定保存列中的某个数据到row中,第二个参数为第几列,第三个参数为第几行(只能保存一个值),最后一个参数就是你想要保存到的parameter名称
lrd_ora8_save_col(OraStm1, 1, 1, 0, "ResultQuery");
//code by shiwanli----------获取第二列并赋值 lrd_ora8_save_col(OraStm1, 2, 1, 0, "resultusername");
//code by shiwanli----------获取结果集
lrd_ora8_fetch(OraStm1, -2, 2, &rownum, 0, 2, 0, 0);
//code by shiwanli----------打印结果
lr_message("查询出的结果为: %s", lr_eval_string("{ResultQuery}"));
//code by shiwanli----------释放连接数据库的各种变量
lrd_handle_free(&OraStm1, 0);
lrd_session_end(OraSvc1, OraSes1, 0, 0);
lrd_server_detach(OraSrv1, 0, 0);
lrd_handle_free(&OraEnv1, 0);
strcat(Temp,lr_eval_string("{ResultQuery}"));
lr_save_string(Temp,"Prem_value");
lr_message("缴费金额为: %s", lr_eval_string("{Prem_value}"));
return 0;
}
工作过程中发现我在某台机器上执行成功,但是我重新新建一个脚本就会报这样那样的错误。为了让看到后来人能少走弯路下面
我将详细解释下如何才能成功执行此脚本。
1、如果你是直接使用oracle(2-tier)协议创建的脚本的话那你需要修改
vdf.h print.inl 这两个文件【此两个文件中的内容我将在后面贴出来,这个博客不会贴附件。。。。。。】
然后你再执行一下脚本,试一下是不是可以了?可以从数据库中查出数据了?
2、如果你是使用web协议创建的脚本的话,需要修改的内容如下
修改脚本目录下的.usr文件中的如下字段
AdditionalTypes=Oracle,QTWeb
ActiveTypes=Oracle,QTWeb
GenerateTypes=Oracle,QTWeb
修改脚本目录下的globals.h添加如下内容
#include "vdf.h"
#include "print.inl"
拷贝vdf.h文件到脚本目录下
拷贝print.inl文件到脚本目录下
再执行下,看看应该是ok了吧。
下面贴出vdf.h内容
/* vdf.h */
#ifndef VDF_H
#define VDF_H
#define LRD_RECORDED_UNDER_WIN32
#include "lrd.h"
static LRD_INIT_INFO InitInfo = {LRD_INIT_INFO_EYECAT};
static LRD_DEFAULT_DB_VERSION DBTypeVersion[] =
{
{LRD_DBTYPE_NONE, LRD_DBVERSION_NONE}
};
static unsigned long uliRowsProcessed;
static LRD_VAR_DESC USER_D1 =
{LRD_VAR_DESC_EYECAT, 1, 31, LRD_DBTYPE_ORACLE, {0, 1, 0}, DT_SZ};
static unsigned long uliFetchedRows;
static LRD_VAR_DESC ATTRIBUTE_D2 =
{LRD_VAR_DESC_EYECAT, 1, 250, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC SCOPE_D3 =
{LRD_VAR_DESC_EYECAT, 1, 250, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC NUMERIC_VALUE_D4 =
{LRD_VAR_DESC_EYECAT, 1, 250, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC CHAR_VALUE_D5 =
{LRD_VAR_DESC_EYECAT, 1, 250, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC DATE_VALUE_D6 =
{LRD_VAR_DESC_EYECAT, 1, 250, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC CHAR_VALUE_D7 =
{LRD_VAR_DESC_EYECAT, 1, 250, LRD_DBTYPE_ORACLE, {0, 1, 0}, DT_SZ};
static LRD_VAR_DESC P1D8 =
{LRD_VAR_DESC_EYECAT, 1, 8, LRD_DBTYPE_ORACLE, {1, 1, 0},
DT_SF_STRIPPED_SPACES};
static LRD_VAR_DESC DECODE_A_A_1_2_D9 =
{LRD_VAR_DESC_EYECAT, 1, 22, LRD_DBTYPE_ORACLE, {1, 1, 0},
DT_NUMERIC};
static LRD_VAR_DESC USERCODE_D10 =
{LRD_VAR_DESC_EYECAT, 15, 21, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC USERNAME_D11 =
{LRD_VAR_DESC_EYECAT, 15, 21, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC COMCODE_D12 =
{LRD_VAR_DESC_EYECAT, 15, 21, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC PASSWORD_D13 =
{LRD_VAR_DESC_EYECAT, 15, 17, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC USERDESCRIPTION_D14 =
{LRD_VAR_DESC_EYECAT, 15, 51, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC USERSTATE_D15 =
{LRD_VAR_DESC_EYECAT, 15, 2, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC UWPOPEDOM_D16 =
{LRD_VAR_DESC_EYECAT, 15, 11, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC CLAIMPOPEDOM_D17 =
{LRD_VAR_DESC_EYECAT, 15, 3, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC OTHERPOPEDOM_D18 =
{LRD_VAR_DESC_EYECAT, 15, 3, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC POPUWFLAG_D19 =
{LRD_VAR_DESC_EYECAT, 15, 2, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC SUPERPOPEDOMFLAG_D20 =
{LRD_VAR_DESC_EYECAT, 15, 2, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC OPERATOR_D21 =
{LRD_VAR_DESC_EYECAT, 15, 61, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC MAKEDATE_D22 =
{LRD_VAR_DESC_EYECAT, 15, 15, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC MAKETIME_D23 =
{LRD_VAR_DESC_EYECAT, 15, 9, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC VALIDSTARTDATE_D24 =
{LRD_VAR_DESC_EYECAT, 15, 15, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC VALIDENDDATE_D25 =
{LRD_VAR_DESC_EYECAT, 15, 15, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC CERTIFYFLAG_D26 =
{LRD_VAR_DESC_EYECAT, 15, 2, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC EDORPOPEDOM_D27 =
{LRD_VAR_DESC_EYECAT, 15, 3, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static LRD_VAR_DESC AGENTCOM_D28 =
{LRD_VAR_DESC_EYECAT, 15, 21, LRD_DBTYPE_ORACLE, {1, 1, 0}, DT_SZ};
static void FAR * OraEnv1;
static void FAR * OraSvc1;
static void FAR * OraStm1;
static void FAR * OraStm2;
static void FAR * OraStm3;
static void FAR * OraStm4;
static void FAR * OraStm5;
static void FAR * OraStm6;
static void FAR * OraStm7;
static void FAR * OraBnd1;
static void FAR * OraDef1;
static void FAR * OraDef2;
static void FAR * OraDef3;
static void FAR * OraDef4;
static void FAR * OraDef5;
static void FAR * OraDef6;
static void FAR * OraDef7;
static void FAR * OraDef8;
static void FAR * OraDef9;
static void FAR * OraDef10;
static void FAR * OraDef11;
static void FAR * OraDef12;
static void FAR * OraDef13;
static void FAR * OraDef14;
static void FAR * OraDef15;
static void FAR * OraDef16;
static void FAR * OraDef17;
static void FAR * OraDef18;
static void FAR * OraDef19;
static void FAR * OraDef20;
static void FAR * OraDef21;
static void FAR * OraDef22;
static void FAR * OraDef23;
static void FAR * OraDef24;
static void FAR * OraDef25;
static void FAR * OraDef26;
static void FAR * OraDef27;
static void FAR * OraSrv1;
static void FAR * OraSes1;
static void FAR * OraSes2;
#endif
下面贴出print.inl文件内容
#ifndef INL_H
#define INL_H
LRD_ORA8_PRINT_ROW_PROTO(PrintRow2)
{
LRDRET gjLRDRet = LRDRET_I_OK;
char szUSER_D1[256];
lrd_to_printable(&USER_D1, muliRowIndex, szUSER_D1, 256, "");
lr_debug_message(LR_MSG_CLASS_RESULT_DATA, "%s", szUSER_D1);
return gjLRDRet;
}
LRD_ORA8_PRINT_ROW_PROTO(PrintRow6)
{
LRDRET gjLRDRet = LRDRET_I_OK;
char szDECODE_A_A_1_2_D9[256];
lrd_to_printable(&DECODE_A_A_1_2_D9, muliRowIndex, szDECODE_A_A_1_2_D9, 256, "");
lr_debug_message(LR_MSG_CLASS_RESULT_DATA,a "%s", szDECODE_A_A_1_2_D9);
return gjLRDRet;
}
LRD_ORA8_PRINT_ROW_PROTO(PrintRow8)
{
LRDRET gjLRDRet = LRDRET_I_OK;
char szUSERCODE_D10[256];
char szUSERNAME_D11[256];
char szCOMCODE_D12[256];
char szPASSWORD_D13[256];
char szUSERDESCRIPTION_D14[256];
char szUSERSTATE_D15[256];
char szUWPOPEDOM_D16[256];
char szCLAIMPOPEDOM_D17[256];
char szOTHERPOPEDOM_D18[256];
char szPOPUWFLAG_D19[256];
char szSUPERPOPEDOMFLAG_D20[256];
char szOPERATOR_D21[256];
lrd_to_printable(&USERCODE_D10, muliRowIndex, szUSERCODE_D10, 256, "");
lrd_to_printable(&USERNAME_D11, muliRowIndex, szUSERNAME_D11, 256, "");
lrd_to_printable(&COMCODE_D12, muliRowIndex, szCOMCODE_D12, 256, "");
lrd_to_printable(&PASSWORD_D13, muliRowIndex, szPASSWORD_D13, 256, "");
lrd_to_printable(&USERDESCRIPTION_D14, muliRowIndex, szUSERDESCRIPTION_D14, 256, "");
lrd_to_printable(&USERSTATE_D15, muliRowIndex, szUSERSTATE_D15, 256, "");
lrd_to_printable(&UWPOPEDOM_D16, muliRowIndex, szUWPOPEDOM_D16, 256, "");
lrd_to_printable(&CLAIMPOPEDOM_D17, muliRowIndex, szCLAIMPOPEDOM_D17, 256, "");
lrd_to_printable(&OTHERPOPEDOM_D18, muliRowIndex, szOTHERPOPEDOM_D18, 256, "");
lrd_to_printable(&POPUWFLAG_D19, muliRowIndex, szPOPUWFLAG_D19, 256, "");
lrd_to_printable(&SUPERPOPEDOMFLAG_D20, muliRowIndex, szSUPERPOPEDOMFLAG_D20, 256, "");
lrd_to_printable(&OPERATOR_D21, muliRowIndex, szOPERATOR_D21, 256, "");
lr_debug_message(LR_MSG_CLASS_RESULT_DATA, "%s, %s, %s, %s, %s, %s,"
"%s, %s, %s, %s, %s, %s, ...", szUSERCODE_D10, szUSERNAME_D11,
szCOMCODE_D12, szPASSWORD_D13, szUSERDESCRIPTION_D14,
szUSERSTATE_D15, szUWPOPEDOM_D16, szCLAIMPOPEDOM_D17,
szOTHERPOPEDOM_D18, szPOPUWFLAG_D19, szSUPERPOPEDOMFLAG_D20,
szOPERATOR_D21);
return gjLRDRet;
}
#ifndef CCI
BEGIN_VUSER_DECLARATION
DECLARE_VUSER_RUN("Vuser Run", Actions)
END_VUSER_DECLARATION
#endif
#endif
TAG:
标题搜索
日历
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
1 | 2 | 3 | 4 | ||||||
5 | 6 | 7 | 8 | 9 | 10 | 11 | |||
12 | 13 | 14 | 15 | 16 | 17 | 18 | |||
19 | 20 | 21 | 22 | 23 | 24 | 25 | |||
26 | 27 | 28 | 29 | 30 | 31 |
我的存档
数据统计
- 访问量: 177875
- 日志数: 90
- 建立时间: 2009-01-09
- 更新时间: 2013-03-22