Loadrunner与SQL Server的操作可以通过录制的方式来实现,但本文还是通过直接调用loadrunner本身的function来实现sql语句的操作,

主要用到的是lr_db_connect和lr_db_executeSQLStatement两个函数.

1、脚本协议:选择web service

在函数lr_db_connect在协议选择的时候只能选择Web Services协议。
2、脚本,以测试MySQL为例:

/*需要的表结构如下

CREATE TABLE `test_data` (

`order_id` BIGINT UNSIGNED NOT NULL COMMENT 'Order numbers. Must be unique.',

`status` BOOL NOT NULL DEFAULT '0' COMMENT 'Whether data has been used or not. A value of 0 means FALSE.',

`date_used` DATETIME NULL COMMENT 'Date/time that the data was used.',

UNIQUE (

`order_id`

)

) ENGINE = innodb COMMENT = 'LoadRunner test data';

*/

Action()

{

int rc;

int db_connection; // 数据库连接

int query_result; // 查询结果集 MYSQL_RES

char** result_row; // 查询的数据衕

char *server = "localhost";

char *user = "root";

char *password = "123456789";

char *database = "test";

int port = 3306;

int unix_socket = NULL;

int flags = 0;

// 找到libmysql.dll的所在位置.

rc = lr_load_dll("C://Program Files//MySQL//MySQL Server 5.1//bin//libmysql.dll");

if (rc != 0) {

lr_error_message("Could not load libmysql.dll");

lr_abort();

}

// 创建MySQL对象

db_connection = mysql_init(NULL);

if (db_connection == NULL) {

lr_error_message("Insufficient memory");

lr_abort();

}

// 连接到MySQL数据库

rc = mysql_real_connect(db_connection, server, user, password, database, port, unix_socket, flags);

if (rc == NULL) {

lr_error_message("%s", mysql_error(db_connection));

mysql_close(db_connection);

lr_abort();

}

// 向数据库插入数据

// 此处的 {ORDER_ID} 是一个参数,简单测试时可以用一个常数代替

lr_save_string (lr_eval_string("INSERT INTO test_data (order_id) VALUES ({ORDER_ID})"),"paramInsertQuery");

rc = mysql_query(db_connection, lr_eval_string("{paramInsertQuery}"));

if (rc != 0) {

lr_error_message("%s", mysql_error(db_connection));

mysql_close(db_connection);

lr_abort();

}

// 从数据库读取一个数据并显示

rc = mysql_query(db_connection, "SELECT order_id FROM test_data WHERE status IS FALSE LIMIT 1");

if (rc != 0) {

lr_error_message("%s", mysql_error(db_connection));

mysql_close(db_connection);

lr_abort();

}

query_result = mysql_use_result(db_connection);

if (query_result == NULL) {

lr_error_message("%s", mysql_error(db_connection));

mysql_free_result(query_result);

mysql_close(db_connection);

lr_abort();

}

// 如果结果集包含多行数据,需要多次调用 mysql_fetch_row 直到返回NULL

result_row = (char **)mysql_fetch_row(query_result);

if (result_row == NULL) {

lr_error_message("Did not expect the result set to be empty");

mysql_free_result(query_result);

mysql_close(db_connection);

lr_abort();

}

// 保存参数,用于删除这行数据

lr_save_string(result_row[0], "paramOrderID");

lr_output_message("Order ID is: %s", lr_eval_string("{paramOrderID}"));

mysql_free_result(query_result);

// 在事务里更新一行数据,需要用InnoDB引擎

rc = mysql_query(db_connection, "BEGIN"); //启动事务

if (rc != 0) {

lr_error_message("%s", mysql_error(db_connection));

mysql_close(db_connection);

lr_abort();

}

// 使用 "FOR UPDATE" 锁住要更新的数据行

rc = mysql_query(db_connection, "SELECT order_id FROM test_data WHERE status IS FALSE LIMIT 1 FOR UPDATE");

if (rc != 0) {

lr_error_message("%s", mysql_error(db_connection));

mysql_close(db_connection);

lr_abort();

}

query_result = mysql_use_result(db_connection);

if (query_result == NULL) {

lr_error_message("%s", mysql_error(db_connection));

mysql_free_result(query_result);

mysql_close(db_connection);

lr_abort();

}

result_row = (char **)mysql_fetch_row(query_result);

if (result_row == NULL) {

lr_error_message("没有查询到结果");

mysql_free_result(query_result);

mysql_close(db_connection);

lr_abort();

}

lr_save_string(result_row[0], "paramOrderID");

lr_output_message("Order ID is: %s", lr_eval_string("{paramOrderID}"));

mysql_free_result(query_result);

lr_save_string(lr_eval_string("UPDATE test_data SET status=TRUE, date_used=NOW() WHERE order_id='{paramOrderID}'"),"paramUpdateQuery");

rc = mysql_query(db_connection, lr_eval_string("{paramUpdateQuery}"));

if (rc != 0) {

lr_error_message("%s", mysql_error(db_connection));

mysql_close(db_connection);

lr_abort();

}

rc = mysql_query(db_connection, "COMMIT"); // 提交事务

if (rc != 0) {

lr_error_message("%s", mysql_error(db_connection));

mysql_close(db_connection);

lr_abort();

}

// 再次查找数据,应该为空了,因为前面的事务更新了标志

rc = mysql_query(db_connection, "SELECT order_id FROM test_data WHERE status IS FALSE LIMIT 1");

if (rc != 0) {

lr_error_message("%s", mysql_error(db_connection));

mysql_close(db_connection);

lr_abort();

}

query_result = mysql_use_result(db_connection);

if (query_result == NULL) {

lr_error_message("%s", mysql_error(db_connection));

mysql_free_result(query_result);

mysql_close(db_connection);

lr_abort();

}

result_row = (char **)mysql_fetch_row(query_result);

if (result_row == NULL) {

lr_output_message("Result set is empty as expected");

mysql_free_result(query_result);

} else {

lr_error_message("Did not expect the result set to contain any rows");

mysql_free_result(query_result);

mysql_close(db_connection);

lr_abort();

}

// 删除数据

lr_save_string(lr_eval_string("DELETE FROM test_data WHERE order_id = '{paramOrderID}'"),"paramDeleteQuery");

rc = mysql_query(db_connection, lr_eval_string("{paramDeleteQuery}"));

if (rc != 0) {

lr_error_message("%s", mysql_error(db_connection));

mysql_close(db_connection);

lr_abort();

}

// 释放MySQL资源

mysql_close(db_connection);

return 0;

}

2.sql和OLEDB的例子,ConnectionType=OLEDB时ConnectionString后面必须指定Provider属性,lr_db_connect中

的ConnectionName可以随意指定,但是lr_db_executeSQLStatement中的ConnectionName必须和其保持一致。

Action()

{

int NumRows=0;

double times=0;

int i=1;

//建立连接,ConnectionType=SQL

lr_db_connect("StepName=DatabaseConnection",

"ConnectionString=Data Source=172.16.1.215;Initial Catalog=LayIM;Persist Security Info=True;User ID=sa;Password=sa",

"ConnectionName=MyCon",

"ConnectionType=SQL",

LAST );

/*建立连接,ConnectionType=OLEDB

lr_db_connect("StepName=Connect",

"ConnectionString=Provider=SQLOLEDB;Data Source=.;Initial Catalog=my_test;User Id=sa;Password=123456",

"ConnectionName=MyCon",

"ConnectionType=OLEDB", //ConnectionType=SQL时,ConnectionString不可以带有Provider;ConnectionType=OLEDB时,必须带Provider

LAST);

*/

//执行SQL

lr_start_transaction("SQL查询");

NumRows = lr_db_executeSQLStatement("StepName=PerformQuery",

"ConnectionName=MyCon",

// 数据库语句

"SQLStatement=SELECT * FROM layim_user ORDER BY id DESC ",

"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",

LAST );*/

//获取当前第一条记录

lr_db_getvalue("StepName=GetValue",

"DatasetName=MyDataSet",

"Column=nickname",

"Row=current",

"OutParam=MyOutputParam",

LAST );

// 输出当前查询记录

lr_output_message("The value is: %s", lr_eval_string("{MyOutputParam}") );

while (i<=10) {//输出10条记录

lr_db_getvalue("StepName=GetValue",

"DatasetName=MyDataSet",

"Column=nickname",

"Row=next",

"OutParam=MyOutputParam",

LAST);

lr_output_message("The value %d is: %s", i, lr_eval_string("{MyOutputParam}") );

i=i+1;

}

lr_output_message("The query returned %d rows.", NumRows);

//释放结果

/*lr_db_dataset_action("StepName=RemoveDataset",

"DatasetName=MyDataSet",

"Action=REMOVE",

LAST);*/

lr_start_transaction("SQL插入");

NumRows = lr_db_executeSQLStatement("StepName=Insert",

"ConnectionName=MyCon",

// Insert语句,本例中第一列id是自增主键

"SQLStatement=Insert into layim_user values ('test','123456','test888888','','/test/test',getdate(),'111111',0) ",

"DatasetName=MyDataSet",

LAST );

times=lr_get_transaction_duration("SQL插入");

lr_end_transaction("SQL插入", LR_AUTO);

lr_output_message("The insert date %d rows.", NumRows);

lr_output_message("SQL插入语句执行时间 %f ", times);

//关闭链接

lr_db_disconnect("stepname=Disconnect","connectionname=MyCon",LAST);

return 0;

}

Loadrunner测试数据库性能,测试SQL语句的脚本例子的更多相关文章

  1. 通过MyEclipse工具直接操作数据库,执行sql语句,方便快捷

    原文:通过MyEclipse工具直接操作数据库,执行sql语句,方便快捷 通过MyEclipse操作数据库,执行sql语句使我们不用切换多个工具,直接工作,方便快捷.效果如下: 步骤1:通过MyEcl ...

  2. 通过MyEclipse操作数据库,执行sql语句使我们不用切换多个工具,直接工作,方便快捷

    通过MyEclipse操作数据库,执行sql语句使我们不用切换多个工具,直接工作,方便快捷.效果如下:     步骤1:通过MyEclipse中的window->show View->ot ...

  3. 在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计、SQL语句、java等层面的解决方案。

    在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计.SQL语句.java等层面的解决方案. 解答: 1)数据库设计方面: a. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 whe ...

  4. Oracle中查询和定位数据库问题的SQL语句

    --1)查询和定位数据库问题的SQL语句--Oracle常用性能监控SQL语句.sql --1查询锁表信息 select vp.SPID, vs.P1, vs.P1RAW, vs.P2, vs.EVE ...

  5. 【转载】 Sqlserver查看数据库死锁的SQL语句

    在Sqlsever数据库中,有时候操作数据库过程中会进行锁表操作,在锁表操作的过程中,有时候会出现死锁的情况出现,这时候可以使用SQL语句来查询数据库死锁情况,主要通过系统数据库Master数据库来查 ...

  6. oracle数据库查询日期sql语句(范例)、向已经建好的表格中添加一列属性并向该列添加数值、删除某一列的数据(一整列)

    先列上我的数据库表格: c_date(Date格式)     date_type(String格式) 2011-01-01                   0 2012-03-07         ...

  7. Oracle数据库常用的Sql语句整理

    Oracle数据库常用的Sql语句整理 查看当前用户的缺省表空间 : select username,default_tablespace from user_users; 2.查看用户下所有的表 : ...

  8. Oracle种常用性能监控SQL语句

    --Oracle常用性能监控SQL语句 --1 SELECT * FROM SYS.V_$SQLAREA WHERE DISK_READS > 100; --2 监控事例的等待 SELECT E ...

  9. sql server 2008 数据库管理系统使用SQL语句创建登录用户步骤详解

    介绍了sql server 2008 数据库管理系统使用SQL语句创建登录用户步骤详解 --服务器角色: --固定服务器角色具有一组固定的权限,并且适用于整个服务器范围. 它们专门用于管理 SQL S ...

随机推荐

  1. 使用Crawler框架搭建自己的爬虫框架MyCrawler

    自己写一个爬虫框架的目的: 完美架构 在实际的数据采集编码过程中,发现代码比较乱,抓取数据,存储数据的代码混杂在一起,为了构建比较完美的数据采集框架 敏捷开发 将数据采集进行标准流程化,每个标准流程都 ...

  2. react 入坑笔记(六) - 组件的生命周期

    React 组件生命周期 详细参考: react 组件生命周期 组件的生命周期可分为三个状态: 1.Mounting:已经挂载/插入到真实 DOM 树上: 2.Updating:正在被重新渲染: 3. ...

  3. cocos 常用组件

    前面的话 本文将详细介绍 cocos 中的常用组件 Sprite [概述] Sprite(精灵)是 2D 游戏中最常见的显示图像的方式,在节点上添加 Sprite 组件,就可以在场景中显示项目资源中的 ...

  4. 关于【jq插件开发】

    很详细,原文链接:https://www.cnblogs.com/Wayou/p/jquery_plugin_tutorial.html#commentform和https://www.cnblogs ...

  5. Luogu3732 [HAOI2017] 供给侧改革 【后缀数组】【线段树】【乱搞】

    题目分析: 这道题我是乱搞的,因为他说$01$串是随机的. 那么我们可以猜测能够让LCP变大的地方很少.求出后缀数组之后可能让LCP变大的地方就等价于从大到小往height里动态加点同时维护这个点左右 ...

  6. 虚拟机 模拟centos 7 系统安装

    Cnetos 服务器安装过程  1.制作U盘启动器 网上有很多制作U盘启动的教程,这里就不详细说了 2.用U盘启动电脑进入安装界面 3.开始安装 等待片刻后,正常的应该会进入语言选择界面了. 选择中文 ...

  7. web技术应用分享

    https://www.helloweba.com/nav.html      Helloweba为广大前端开发者收录了常用实用的前端资源工具,方便大家学习和查阅. https://www.hello ...

  8. H5_0007:使用base64做为背景图片

    page { overflow:hidden; position:fixed; /* background-image:url('http://p0d5ombx1.bkt.clouddn.com/lo ...

  9. file 自定义上传附件并展示缩略图

    效果图镇楼..   写的有点乱.上传一个实例供大家参考--附件下载地址如何下: https://files.cnblogs.com/files/fchx91/uploadFiles.rar 2019- ...

  10. JGUI源码:实现图标按钮及下拉菜单(16)

    效果如下 代码片段如下 <div class="jgui-btn" id="personalbtn" style="float:right;&q ...