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. DAY29、元类

    一.eval内置函数eval内置函数的使用场景: 1.执行字符串会得到相应的执行结果 2.一般用于类型转换,得到dict.list.tuple例: dic_str = ''{'a':1,'b':2}' ...

  2. 配置spring的监听器 让spring随项目的启动而启动

    <!-- 配置spring的监听器 让spring随项目的启动而启动 --> <listener> <listener-class>org.springframew ...

  3. 2018 API变化

  4. CF1152 F. Neko Rules the Catniverse (dp)

    题意 一条长为 \(n\) 的数轴,可以从任意整点 \(\in [1, n]\) 出发,假设当前在 \(x\) ,下一步能到达的点 \(y\) 需要满足,\(y\) 从未到过,且 \(1 \le y ...

  5. Django启动时报错Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试

    1.系统环境配置 window 10 + python 3.6 + django 1.11.20 2.报错原因 原因:可以肯定是端口被占用了,但是我只开了一个django,那究竟是哪款软的骚操作占用我 ...

  6. 基于Redis缓存几十万条记录的快速模糊检索的功能实现(c#)

    在开发一套大型的信息系统中,发现很多功能需要按公司查询,各个模块在实现时都是直接查数据库进行模糊检索,虽然对表进行向各个应用的库中进行了同步,但是在使用中发现,模糊检索公司时还是比较卡,原始的查询数据 ...

  7. leveldb实现原理

    LevelDb日知录之一:LevelDb 101 说起LevelDb也许您不清楚,但是如果作为IT工程师,不知道下面两位大神级别的工程师,那您的领导估计会Hold不住了:Jeff Dean和Sanja ...

  8. Flash设置(各种版本浏览器包括低版本IE)

    涉及到的各种版本flash百度下都能下到的,不再说明. Flash的安装比较麻烦,涉及多种浏览器.多种操作系统支持,安装.设置的地方比较多,以下说明基本涉及大部分安装过程中可能遇到的问题,如果安装或视 ...

  9. MySQL实战45讲学习笔记:索引(第五讲)

    一.需要回表的案例 在下面表T中,执行下面语句,需要执行几次树的搜索操作?会扫描多少行? select * from T where k between 3 and 5 1.初始化语句 mysql&g ...

  10. LeetCode-11. 盛最多水的容器

    给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线, ...