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. css 图像热区

    CSS图像热区 在img标签当中,存在一个属性usemap属性,用来和map标签进行绑定,从而实现图像热区.所谓的图像热区,其实指的是在图像中插入一个连接,当用户点击图像的指定区域后就会进行页面跳转. ...

  2. OMS自动化运维平台部署

    OMS自动化运维平台部署 一.基础环境安装 yum -y install mariadb mariadb-devel mariadb-server wget epel-release python-d ...

  3. SPOJ DIVCNT2

    SPOJ DIVCNT2 题目大意: 求\(S2(n)=\sum_{i=1}^{n}\sigma_0{(i^2)}\) . 题解 我们可以先考虑括号里只有一个\(i\)的情况,这样,我们把\(i\)分 ...

  4. kubernetes调度pod运行于master节点上

    应用背景: 使用kubeadm部署的kubernetes集群,其master节点默认拒绝将pod调度运行于其上的,加点官方的术语就是:master默认被赋予了一个或者多个“污点(taints)”,“污 ...

  5. 小计:Shopee批量删除修复~附脚本

    需求 昨天浪的时候,无意之间看到文职人员在一个个删除违禁商品,大概23个店铺,每个店铺500多个商品,页面是用Ajax异步加载的,每删一个就需要等几秒,粗略估计一下用时:9h左右 然后了解了下是什么情 ...

  6. 大规模使用 Apache Kafka 的20个最佳实践

    必读 | 大规模使用 Apache Kafka 的20个最佳实践 配图来源:书籍<深入理解Kafka> Apache Kafka是一款流行的分布式数据流平台,它已经广泛地被诸如New Re ...

  7. pycharm的Database连接新的Mysql5.7报错[08001]

    在URL的后面增加参数: ?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC 解决. 原因是虽然mysql5.7的s ...

  8. vue+elementUI+axios实现的全局loading加载动画

    在项目中,很多时候都需要loading加载动画来缓解用户的焦虑等待,比如说,我打开了一个页面,而这个页面有很多接口请求,但浏览器的请求并发数就那么几个,再加上如果网速不行的话,那么这时候,用户很可能就 ...

  9. RTC及sensor时间同步

    https://blog.csdn.net/dai_jing/article/details/38147419 ----------------------------- linux 的系统时间有时跟 ...

  10. 1.8分布式集群模式基础(VM安装多台服务器)

    前言 一晃就是10几天,学习的过程是断断续续的,对个人来说,这并不是一个良好的状态.在这10几天了,迷恋起了PS... 从今天起,坚持一周4篇,额.希望吧 在之前的随笔中,我安装了Xshell 和 C ...