通过C/C++去操作数据库需要调用mysql客户端api,常用api和调用举例见后面。
目录
一.常用api
1.环境初始化
/**
初始化得到一个MYSQL对象,参数mysql一般为空
*/
MYSQL *mysql_init(MYSQL *mysql) ;
2.连接 mysql 的服务器
/**
用初始化的MYSQL指针去连接服务器,得到一个连接的MYSQL独享
返回值:
成功: 返回MYSQL*连接句柄, 返回值与第1个参数的值相同
失败,返回NULL
*/
MYSQL *mysql_real_connect(
MYSQL *mysql, // mysql_init() 函数的返回值
const char *host, // mysql服务器的主机地址, 写IP地址即可,localhost, null -> 代表本地连接
const char *user, // mysql服务器的用户名, 默认: root
const char *passwd, // mysql服务器用户对应的密码,
const char *db, // 使用的数据库的名字
unsigned int port, // mysql服务器监听的端口,如果为0,则使用默认端口3306, 否则使用指定的这个端口
const char *unix_socket,// 本地套接字, 不使用指定为 NULL
unsigned long client_flag); // 指定为0即可
3.增删改查操作
/**
执行增删改查的sql语句
参数:
mysql: mysql_real_connect函数的返回值
query: 要执行的sql语句,结尾不需要加;(分号)
返回值:
成功:返回0,如果是查询, 则查询结果在mysql指针指向对象中
失败:返回非0值,
*/
int mysql_query(MYSQL *mysql, const char *query);
4.事务处理
对数据库进行增加/删除/修改操作时,需要进行事务处理,执行完操作后要判断状态
操作成功:事务提交
操作失败:回滚数据
/**
接口默认会提交事务,自动提交事务不利于对数据的控制,可以修改手动提交事务
mode: 0:不自动提交事务 1:自动提交事务
返回值:
成功:返回0
失败:返回非0
*/
my_bool mysql_autocommit(MYSQL *mysql, my_bool mode)
// 事务提交
/**
提交事务
返回值:
成功:返回0
失败:返回非0
*/
my_bool mysql_commit(MYSQL *mysql);
/**
回滚数据
返回值:
成功:返回0
失败:返回非0
*/
my_bool mysql_rollback(MYSQL *mysql)
5.处理查询数据集合
5.1得到结果集
/**
从mysql中得到结果集,结果集存放在MYSQL_RES类型的内存中
成功:得到结果集
失败:返回NULL
*/
MYSQL_RES *mysql_store_result(MYSQL *mysql);
5.2得到查询结果的列数
/**
得到查询结果的列数
返回值:代表列数
*/
unsigned int mysql_num_fields(MYSQL_RES *result)
5.3得到查询结果列信息
/**
获取查询结果集合的列名称
返回值:列信息结构体
*/
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result);
mysql.h中MYSQL_FIELD定义如下:
typedef struct st_mysql_field {
char *name; /* Name of column */
char *org_name; /* Original column name, if an alias */
char *table; /* Table of column if column was a field */
char *org_table; /* Org table name, if table was an alias */
char *db; /* Database for table */
char *catalog; /* Catalog for table */
char *def; /* Default value (set by mysql_list_fields) */
unsigned long length; /* Width of column (create length) */
unsigned long max_length; /* Max width for selected set */
unsigned int name_length;
unsigned int org_name_length;
unsigned int table_length;
unsigned int org_table_length;
unsigned int db_length;
unsigned int catalog_length;
unsigned int def_length;
unsigned int flags; /* Div flags */
unsigned int decimals; /* Number of decimals in field */
unsigned int charsetnr; /* Character set */
enum enum_field_types type; /* Type of field. See mysql_com.h for types */
void *extension;
} MYSQL_FIELD;
/**
得到查询结果集合列数,方法一
*/
unsigned int mysql_num_fields(MYSQL_RES *res);
/**
得到查询结果集合列数,方法二
*/
unsigned int mysql_field_count(MYSQL *mysql);
5.4获取结果集合的下一行记录
/**
得到下一行记录
参数:
result: 结果集
返回值:
成功: 记录中每个字段的值
失败: NULL, 读取完毕
*/
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
mysql.h中MYSQL_ROW定义如下,是一个二级指针,一级指针则为一行中每列具体的值
typedef char **MYSQL_ROW; /* return data as array of strings */
/**
得到结果集合总行数
*/
my_ulonglong STDCALL mysql_num_rows(MYSQL_RES *res);
mysql.h中my_ulonglong定义如下
#ifndef MY_GLOBAL_INCLUDED
#if defined (_WIN32)
typedef unsigned __int64 my_ulonglong;
#else
typedef unsigned long long my_ulonglong;
#endif
#endif
6.释放资源,关闭连接
/**
释放结果集对应内存资源
*/
void mysql_free_result(MYSQL_RES *result);
/**
关闭数据库连接
*/
void mysql_close(MYSQL *mysql);
7.字符集相关
/**
得到api使用的编码方式
*/
const char *mysql_character_set_name(MYSQL *mysql)
/**
设置api编码方式
csname:编码方式,要支持中文,参数可选择utf8
*/
int mysql_set_character_set(MYSQL *mysql, char *csname);
8.获取错误信息
/**
得到错误编号
*/
unsigned int mysql_errno(MYSQL *mysql);
/**
得到错误描述
*/
const char *mysql_error(MYSQL *mysql);
二.api调用举例
例如创建数据库和表分别如下:
CREATE DATABASE `TestDB` DEFAULT CHARACTER SET utf8;
CREATE TABLE `employee` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) NOT NULL,
`address` varchar(45) NOT NULL,
`age` int(11) NOT NULL,
`position` varchar(45) NOT NULL,
`remark` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8;
代码如下:
connmysql.cpp
#include <stdio.h>
#include <mysql/mysql.h>
int main(int argc, char* argv[])
{
//1.初始化环境
MYSQL* mysql = mysql_init(NULL);
if(mysql == NULL)
{
printf("mysql_init() error\n");
return -1;
}
//2.连接数据库服务器
mysql = mysql_real_connect(mysql, "localhost", "root", "mysql",
"TestDB", 0, NULL, 0);
if(mysql == NULL)
{
printf("mysql_real_connect() error\n");
return -1;
}
//编码相关
//查看编码
printf("mysql api charset : %s\n", mysql_character_set_name(mysql));
//设置编码为utf8
mysql_set_character_set(mysql, "utf8");
printf("after alter, mysql api charset : %s\n", mysql_character_set_name(mysql));
//3.执行一个sql语句
const char* sql = "select * from employee";
int ret = mysql_query(mysql, sql);
if(ret != 0)
{
printf("mysql_query() error : %s\n", mysql_error(mysql));
return -1;
}
//4.取出结果集
MYSQL_RES* res = mysql_store_result(mysql);
if(res == NULL)
{
printf("mysql_store_result() error : %s\n", mysql_error(mysql));
return -1;
}
//5.结果集中的列数
// int num = mysql_num_fields(res);
int num = mysql_field_count(mysql);
//6.得到所有列的名字, 并且输出
MYSQL_FIELD * fields = mysql_fetch_fields(res);
for(int i=0; i<num; ++i)
{
printf("%-10s\t", fields[i].name);
}
printf("\n");
//7.遍历结果集中所有的行
MYSQL_ROW row;
while( (row = mysql_fetch_row(res)) != NULL)
{
//将当前行中的每一列信息读出
for(int i=0; i<num; ++i)
{
printf("%-10s\t", row[i]);
}
printf("\n");
}
//8.释放资源 - 结果集
mysql_free_result(res);
//9.表中插入数据
//设置事务为手动提交
mysql_autocommit(mysql, 0);
int ret1 = mysql_query(mysql, "insert into employee(name, address, age, position, remark) values('liudehua', 'xianggang', 18, 'one', '天王 1')");
int ret2 = mysql_query(mysql, "insert into employee(name, address, age, position, remark) values('guofucheng', 'beijing', 19, 'two', '天王 2')");
int ret3 = mysql_query(mysql, "insert into employee(name, address, age, position, remark) values('liming', 'chongqing', 20, 'three', '天王 3')");
int ret4 = mysql_query(mysql, "insert into employee(name, address, age, position, remark) values('zhangxueyou', 'tianjin', 21, 'four', '天王 4')");
printf("ret1 = %d, ret2 = %d, ret3 = %d, ret4 = %d\n", ret1, ret2, ret3, ret4);
if(ret1==0 && ret2==0 && ret3==0 && 0 == ret4)
{
//提交事务
mysql_commit(mysql);
}
else
{
printf("error %s\n", mysql_error(mysql));
mysql_rollback(mysql);
}
//关闭数据库
mysql_close(mysql);
return 0;
}
编译运行:
g++ connmysql.cpp -L/user/lib/mysql -lmysqlclient
./a.out
数据库已经存在数据: