C++ Mysql基本操作

C++ Mysql基本操作

连接Mysql

MYSQL *mysql_init(MYSQL *mysql) 

如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。

MYSQL *mysql_real_connect(MYSQL *mysql, \
	const char *host, const char *user, \
	const char *passwd, const char *db, \
	unsigned int port, const char *unix_socket, \
	unsigned long client_flag) 

第一个参数应是已有Mysql结构的地址。调用mysql_real_connect()之前,必须调用mysql_init(MYSQL *)来初始化MYSQL结构.

SQL查询

int mysql_query(MYSQL *mysql, const char *query) 
int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length) 

执行由“query”指向的SQL查询,它应是字符串长度字节“long”。正常情况下,字符串必须包含1条SQL语句,而且不应为语句添加终结分号(‘;’)或“\g”。如果允许多语句执行,字符串可包含由分号隔开的多条语句。
mysql_query()不能用于包含二进制数据的查询,应使用mysql_real_query()取而代之(二进制数据可能包含字符‘\0’,mysql_query()会将该字符解释为查询字符串结束)。此外,mysql_real_query()比mysql_query()快,这是因为它不会在查询字符串上调用strlen()。

结果处理

1.对于Mysql语句的返回的结果集,需要用一个容器去装载,因此首先就需要存储结果的数据结构MYSQL_RES,该结构代表返回行的查询结果(SELECT, SHOW, DESCRIBE, EXPLAIN)。
2.有了存储结果的数据结构,因此可以通过调用结果的返回函数,使其能够将结果存储在MYSQL_RES的类型的结果集中,该函数为:

 MYSQL_RES *mysql_store_result(MYSQL *mysql) 

对于成功检索了数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必须调用mysql_store_result()或mysql_use_result() 。

3.根据结果集判断当前的行数,其函数为:

my_ulonglong mysql_num_rows(MYSQL_RES *result) //返回结果集中的行数。 
my_ulonglong mysql_affected_rows(MYSQL *mysql) //返回上次UPDATE更改的行数,上次DELETE删除的行数,或上次INSERT语句插入的行数。

4.根据结果集判断字段数(列数),想象一下列数属于MYSQL_RES结果集里面的一部分,因此需要重新建立一个数据结构用于存储字段定义,MYSQL_FIELD正是用于此。调用mysql_fetch_fields函数可以将结果集转化为字段域。

unsigned int mysql_num_fields(MYSQL_RES *result) //指函数返回结果集中字段的数。
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)//对于结果集,返回所有MYSQL_FIELD结构的数组。每个结构提供了结果集中1列的字段定义。

5.mysql_fetch_fields()和mysql_fetch_field的区别

MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result) //返回采用MYSQL_FIELD结构的结果集的列。重复调用该函数,以检索关于结果集中所有列的信息。未剩余字段时,mysql_fetch_field()返回NULL。

可以看作mysql_fetch_fields返回的是一个二维结构,而mysql_fetch_field返回的是单列,需要重复调用,才能打印所有列。

测试程序

mysql的结构
example的机构

#include <iostream>
#include <string>
#include <mysql/mysql.h>
using namespace std;

const char* IP = "127.0.0.1";
const char* USER = "root";
const char* PASSWORD = "";
const char* DB = "example";
const int PORT = 3306;

int main(int argc, char *argv[])
{
	MYSQL conn;
	mysql_init(&conn);

	if (!mysql_real_connect(&conn, IP, USER, PASSWORD, DB, PORT, NULL, 0))
	{
		printf("mysql connect failed: %s error\n", mysql_error(&conn));
		mysql_close(&conn);
		return -1;
	}

	printf("mysql connect success\n");

	MYSQL_RES *res;
	mysql_query(&conn, "SELECT * FROM stu_inf");
	res = mysql_store_result(&conn);

	printf("number of dataline: %d\n", (int)mysql_num_rows(res));

#if 0 //get fields
	int col;
	printf("number of field: %d\n", col = mysql_num_fields(res));
	MYSQL_FIELD *field;
	field = mysql_fetch_fields(res);
	for (int i = 0; i < col; i++)
	{
		//string _name = mysql_fetch_fields(res)->name;
		cout << "field name " << i  << ": " << field[i].name << endl;
	}

#elif 0
	int col;
	col = mysql_num_fields(res);
	char *str_field[32];  //定义一个字符串数组存储字段信息
	for (int i = 0; i < col; i++)   //在已知字段数量的情况下获取字段名
	{
		str_field[i] = mysql_fetch_field(res)->name;
		printf("field %d: %s\n", i, str_field[i]);
	}

#else
	int col;
	col = mysql_num_fields(res);
	for (int i = 0; i < col; i++)
	{
		string colName = mysql_fetch_field(res)->name;//这里改为fields只能打印id
		cout << "field " << i << ": " << colName << endl;
	}
#endif


	MYSQL_ROW row;
	while (row = mysql_fetch_row(res))
	{
#if 1
		for (int i = 0; i < col; i++)
		{
			cout << (row[i] ? row[i] : "NULL") << " ";
		}
		cout << endl;
#endif
	}

	mysql_free_result(res);
	mysql_close(&conn);
	return 0;
}

测试结果:
mysql connect success
number of dataline: 2
field 0: id
field 1: name
field 2: phone
1 xq NULL
1 zl NULL

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值