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. IOS 选择会员资格

    选择会员资格 针对所有 Apple 平台进行开发从未如此简单.要开始为 macOS.iOS.tvOS 和 watchOS 开发 app,请从 Mac App Store 下载 Xcode.如果您已准备 ...

  2. 洛谷P1169[ZJOI2007]棋盘制作

    题目 一道悬线法的裸题,悬线法主要是可以处理最大子矩阵的问题. 而这道题就是比较经典的可以用悬线法来处理的题. 而悬线法其实就是把矩阵中对应的每个位置上的元素分别向左向上向右,寻找到不能到达的地方,然 ...

  3. 「洛谷3338」「ZJOI2014」力【FFT】

    题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...

  4. Codeforces 1108F MST Unification(最小生成树性质)

    题目链接:MST Unification 题意:给定一张连通的无向带权图.存在给边权加一的操作,求最少操作数,使得最小生成树唯一. 题解:最小生成树在算法导论中有这个性质: 把一个连通无向图的生成树边 ...

  5. mysq建表参数设置

    建表的完整性约束: not null 与 default unique primary auto_increment foreign key 外键的变种  三种关系 一.介绍 约束条件与数据类型的宽度 ...

  6. Python3下POST请求HTTPS链接

    Python 3.5.2 + Windows 7环境下 第一种:http.client方式 def http_client_post(): conn = http.client.HTTPSConnec ...

  7. JAVA中循环删除list中元素的方法总结【转】

    印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天在使用时发现报错了,然后去科普了一下,再然后发现这是一个误区.下面就来讲一讲..伸手党可直接跳至文末 ...

  8. metasploit与Cobaltstrike互相派生shell

    msf 派生 shell 给 Cobalt strike(前提有一个meterpreter) msf exploit(handler) > use exploit/windows/local/p ...

  9. Maven之阿里云镜像仓库配置

    方式一:全局配置:修改maven的setting.xml配置 在mirrors节点下面添加子节点: <mirror> <id>nexus-aliyun</id> & ...

  10. idea使用记录

    1.在工具栏添加工具