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. 搭建一个简单的本地的dubbo-demo案例

    一.创建一个Maven工程,然后创建三个module模块 二.dubbo-api(maven模块) 创建一个api类,命名为ApiService.java package com.example.se ...

  2. maven 将第三方jar包转成maven的jar包

    转载:https://blog.csdn.net/qq_40644583/article/details/81475135 1.首先你需要准备外部jar包 我的这个jar包现在以及下载解压到桌面 地址 ...

  3. U68364 _GC滑迷宫

    题目背景 _GC买了一双蔡徐坤一代. 题目描述 _GC进入了一个n*m的迷宫.本题的特殊之处在于,_GC只能滑着走.具体来说就是,选定一个方向后,_GC会一直向该方向滑,直到撞到墙.会给出_GC的起始 ...

  4. 快速去水印(win10换图3D工具)

    之前抠图都用ps啥的,后来发现win10自带的工具画图3D可以直接扣简单的图案,达到去水印的效果 1.将图片放入软件中 2.使用神奇选择工具,调整大小,框出图标 3.点击下一步,将没选上的或选多的进行 ...

  5. 洛谷P2604 网络扩容 拆点+费用流

    原题链接 这题貌似比较水吧,最简单的拆点,直接上代码了. #include <bits/stdc++.h> using namespace std; #define N 1000 #def ...

  6. jemter+ant+jenkins进行集成测试

    一下为我学习的一些笔记: 一.安装配置ant 安装地址:http://ant.apache.org/ 1.下载ant一路傻瓜式安装 2.配置ant环境变量:path下配置ant的bin路径 3.将jm ...

  7. CodeForces - 597C Subsequences (树状数组+动态规划)

    For the given sequence with n different elements find the number of increasing subsequences with k + ...

  8. About me & 留言板

    本人名字首字母gzy,就读于gryz,是高二在读生,也是一名oier. 老婆:远近渔. 爱好: 各种体育类项目,(但是不精通,不会打台球),喜欢摄影作品,喜欢听rap和摇滚,也喜欢一些描述生活英文歌曲 ...

  9. Hive 锁处理

    hive有两个锁,共享索(s) 和排它锁(x) 在进行ddl操作时,排他锁会阻止 ddl 操作.drop.alter table 如果一个hive查询使用到了表A,执行时间10分钟.在这10分钟内要d ...

  10. Node.js目录

    [相关学习] npm入门教程 [基础] (1) 初识Node.js (2) 开发环境和调试工具 (3) commonJs 规范 (4) node 概念(global.process进程.调试) (5) ...