LoadRunner11之批量插入SQL数据
一、批量插入
1.背景:数据库需要大量数据时,通过前台界面录入数据,是一个很麻烦的事情,这个时候可以借助工具来对数据库进行批量插入。
2.协议选择:我们选择的是LoadRunner11+webservice协议。
3.分析工作:(1)在录制之前,需要分析插入数据表字段的特性,是唯一还是随机,是否需要拼接等等
(2)表和表之间的关系,主外键以及关联的字段等
目的:为了更好的参数化数据,便于造的数据更加接近真实数据。
目前有2个表,student和stuclass
create table student
(
stu_id char(10) primary key (stu_id),
stu_name varchar(30) not null,
stu_specialty varchar(30) not null,
stu_sex char(2) check( stu_sex in ('男','女'))
)
create table stuclass
(
stu_classid varchar(30) not null,
stu_id char(10) not null primary key (stu_id),
stu_classname varchar(30) not null,
)
其中stu_id是唯一,stu_name使用拼接方式:test+唯一,stu_specitalty:可重复,stu_sex:随意选择
stuclass:stu_id,唯一并且和student表使用同一个参数,stu_classid+stu_classname 定义参数,班级编码对应班级名次,使用same as line XXX
4.代码部分:Action-数据库链接
//链接1 ConnectionType=OLEDB
lr_db_connect("StepName=Connect",
"ConnectionString=Provider=SQLOLEDB;Data Source=localhost,1433;Initial Catalog=test_lr;User Id=sa;Password=sql2008",
"ConnectionName=MyCon",
"ConnectionType=OLEDB", //ConnectionType=SQL时,ConnectionString不可以带有Provider;ConnectionType=OLEDB时,必须带Provider
LAST);
注:链接数据库方式是OLEDB,Data Source='数据源,端口',initial Catalog='数据库名称',User Id:用户名,Password:密码
//链接2 ConnectionType=SQL时
lr_db_connect("StepName=DatabaseConnection",
"ConnectionString=Data Source=192.168.1.251;Initial Catalog=MY_test;Persist Security Info=True;User ID=sa;Password=test1",
"ConnectionName=MeCon",
"ConnectionType=SQL",
LAST ); //ConnectionType=SQL时,ConnectionString不可以带有Provider;
lr_output_message("数据库链接成功");
5.批量插入语句部分
lr_start_transaction("insert_student");
//插入student表
lr_db_executeSQLStatement("StepName=Insert_test",
"ConnectionName=MyCon",
"SQLStatement=insert into student values ('{stu_id}','test_{stu_name}','{stu_specialty}','{sex}')",
"DatasetName=Insert_DataSet",
LAST );
lr_end_transaction("insert_student", LR_AUTO);
//插入class表
lr_start_transaction("insert_class");
lr_db_executeSQLStatement("StepName=Insert_test",
"ConnectionName=MyCon",
"SQLStatement=insert into stuclass values ('{classid}','{stu_id}','{classname}')",
"DatasetName=Insert_DataSet",
LAST );
lr_end_transaction("insert_class", LR_AUTO);
//断开数据库链接
lr_db_disconnect("stepname=Disconnect","connectionname=MyCon",LAST);
6.参数化成功后,运行,确认数据是否插入成功。
7.如要要插入万+条记录,按F4设置迭代次数,运行即可。(或者通过controller设置用户数进行执行)
批量数据插入成功-end
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
二、查询部分
double time;
lr_start_transaction("SQL查询");
NumRows = lr_db_executeSQLStatement("StepName=PerformQuery",
"ConnectionName=MyCon",
// 数据库语句
"SQLStatement=SELECT * FROM ",
"DatasetName=MyDataSet",
LAST );
times=lr_get_transaction_duration("SQL查询"); //查询需要的时间
lr_end_transaction("SQL查询", LR_AUTO);
lr_output_message("The query returned %d rows.", NumRows);
lr_output_message("SQL查询语句执行时间 %f ", times);
/
//打印查询结果
lr_db_dataset_action("StepName=PrintDataset", //随意指定的动作名称
"DatasetName=MyDataSet",
"Action=PRINT", //?RESET: 将光标设置为数据集的第一条记录
//?REMOVE: 释放分配给数据集的内存。
//?PRINT: 将整个数据集的内容打印到重播日志和其他测试报告摘要中。
LAST );
while (i<=10) { //输出前10条记录的“stu_id”列值
lr_db_getvalue("StepName=GetValue", //随意指定的动作名称
"DatasetName=MyDataSet",
"Column=stu_id", //数据表列名
"Row=next", //可选参数:?具体的第几行;?current(表示不移动光标,即当前行);?next(设置光标到下一行)
"OutParam=Value_Param", //查询值的参数名
LAST);
lr_output_message("The value %d is: %s", i, lr_eval_string("{Value_Param}") );
i=i+1;
}
//注lr_db_gevalue函数的使用
//释放结果
lr_db_dataset_action("StepName=RemoveDataset",
"DatasetName=MyDataSet",
"Action=REMOVE",
LAST);
查询结果以及输入结果为:
--------------------------------------------------------------------------------------------------
三、相关函数
其他:数据库链接常用的几个函数,具体使用方法可以在lr函数库中查询
-----------------------
四、问题整理
之前使用了LR12,在数据库查询或者插入时总是存在问题,提示外部组件发生异常“”,导致无法操作成功,通过多次排斥,原因出在插入语句或者是查询语句上。百度找过很多解决方法,最终还是放弃,重新安装LR11,同样的代码,执行成功。
--------------------------------------------------------------------------------------------------------------------------------------------------------
五、扩展 譬如链接oracle数据库,写法如下
lr_db_disconnect用于数据库的连接,可以通过插入该函数,通过LR的向导配置数据库连接参数并测试数据库连接是否成功
//OLEDB方式连接数据库
lr_db_connect("StepName=OracleConnect",
"ConnectionName=db1",
"ConnectionString=Provider=OraOLEDB.Oracle.1;Data Source=netservicename_testbook;Password=Testbook_1;User ID=system",
"ConnectionType=OLEDB",
LAST);
-----------------------------------------------------------------------------------------------------------------------------
六、lr_db_executeSQLStatement函数执行存储过程实例:
lr_db_executeSQLStatement("StepName=StartDeal",
"ConnectionName=XXXOrderDB",
"SQLStatement=exec XXXorderdb..sp1_XXX_firstdealorder"
"@orderid='{ID}',"
"@operator='mazj',"
"@ProcessType = 'NOR',"
"@CorpConfirmType = '',"
"@CorporationID = NULL,"
"@BOS=NULL",
"DatasetName=testDataset",
LAST);