转-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:

 

评分:0

我来说两句

Open Toolbar