目录
一、c++ 链接 MySQL 流程
详细流程如下图:
二、MySQL API
1、常用API数据结构
结构名 | 解析 |
---|---|
MYSQL | 此结构表示一个数据库连接的处理程序。它用于几乎所有的 MySQL 函数。不要试图复制MYSQL结构。无法保证此类副本可用。 |
MYSQL_RES | 此结构表示返回行 ( SELECT, SHOW, DESCRIBE, EXPLAIN)的查询结果。从查询返回的信息称为结果集。 |
MYSQL_ROW | 这是一行数据的类型安全表示。它目前被实现为一个计数字节字符串数组。(如果字段值可能包含二进制数据,则不能将它们视为以空字符结尾的字符串,因为此类值在内部可能包含空字节。)通过调用 mysql_fetch_row()获取。 |
MYSQL_FIELD | 此结构包含元数据:有关字段的信息,例如字段的名称、类型和大小。您可以MYSQL_FIELD通过mysql_fetch_field() 重复调用来获取每个字段的结构。字段值不是这个结构的一部分;它们包含在一个MYSQL_ROW结构中。 |
2、常用API函数
mysql_init()
描述:
分配或初始化适合mysql_real_connect()的MYSQL对象。如果mysql是一个NULL指针,函数将分配、初始化并返回一个新对象。否则,初始化该对象并返回该对象的地址。如果mysql_init()分配了一个新对象,当调用mysql_close()关闭连接时,它将被释放。
函数声明:
MYSQL *
mysql_init(MYSQL *mysql);
返回值:
成功返回一个初始化的MYSQL处理程序;如果没有足够的内存来分配新对象,则为NULL。
举例:
MYSQL *mysql;
mysql_init(mysql);
mysql_real_connect()
描述:
mysql_real_connect()尝试建立一个连接到运行在主机上的MySQL服务器。客户端程序在执行任何其他需要有效MYSQL连接处理程序结构的API函数之前,必须成功连接到服务器。
函数声明:
MYSQL *
mysql_real_connect(MYSQL *mysql, //初始化的数据库
const char *host, //主机IP
const char *user, //用户名
const char *passwd, //用户密码
const char *db, //数据库名称
unsigned int port, //端口号(3306)
//如果unix_socket不是 NULL,则字符串指定要使用的套接字或命名管道
const char *unix_socket,
//client_flag通常为 0
unsigned long client_flag);
返回值:
如果连接成功,则为一个MYSQL*连接处理程序;如果连接不成功,则为NULL。对于成功的连接,返回值与第一个参数的值相同。
举例:
MYSQL mysql;
mysql_init(&mysql);
mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"your_prog_name");
if (!mysql_real_connect(&mysql,"host","user","passwd","database",3306,NULL,0))
{
fprintf(stderr, "Failed to connect to database: Error: %s\n",
mysql_error(&mysql));
}
mysql_query()
描述:
执行SQL语句。通常情况下,字符串必须由一条没有分号的SQL语句组成。
mysql_query()不能用于包含二进制数据的语句。
函数说明:
int
mysql_query(MYSQL *mysql, //MYSQL 对象指针
const char *stmt_str); //sql语句
返回值:
成功返回0,报错时返回非0。
mysql_store_result()
描述:
在调用mysql_real_query()或mysql_query()之后,对于成功生成结果集(SELECT, SHOW, DESCRIBE, EXPLAIN, CHECK TABLE,等等)的每条语句,必须调用mysql_store_result()或mysql_use_result()。在处理完结果集之后,还必须调用mysql_free_result()。
对于其他语句,你不需要调用mysql_store_result()或mysql_use_result(),但是如果你在所有情况下调用mysql_store_result(),它不会造成任何损害或导致任何显著的性能下降。您可以通过检查mysql_store_result()是否返回一个非零值(稍后详细介绍)来检测语句是否有结果集。
要确定语句是否返回结果集,调用mysql_field_count()。参见第5.4.23节,“mysql_field_count()”。
mysql_store_result()将查询的整个结果读取给客户端,分配一个MYSQL_RES结构,并将结果放入这个结构中。
mysql_store_result()如果语句没有返回结果集(例如,如果是一个INSERT语句),或者发生了错误,读取结果集失败,则返回NULL。
如果没有返回行,则返回空结果集。(空结果集不同于作为返回值的空指针。)
在调用mysql_store_result()并得到一个不是空指针的结果之后,可以调用mysql_num_rows()来找出结果集中有多少行。
函数声明:
MYSQL_RES *
mysql_store_result(MYSQL *mysql);
返回值:
指向带有结果的MYSQL_RES结果结构的指针。如果语句没有返回结果集或发生错误,则为NULL。要确定是否发生错误,请检查mysql_error()是否返回非空字符串,mysql_errno()是否返回非零,或mysql_field_count()是否返回零。
mysql_close()
描述:
关闭先前打开的连接。如果处理程序是由mysql_init()或mysql_connect()自动分配的,Mysql_close()也会释放mysql所指向的连接处理程序。关闭处理程序后不要使用它。
函数声明:
void
mysql_close(MYSQL *mysql);
返回值:
无
三、常用的mysql增删改查操作实例
1、在数据库中添加数据
int main()
{
......
// 增加数据测试
const char* sql1 = "insert into user values (NULL, 'song', '99')";
mysql.ExecuteSql(sql1);
......
return 0;
}
// 执行sql语句, 包括增加、删除、更新数据
bool MySQLManager::ExecuteSql(const char * sql)
{
if (mysql_query(&m_mysql, sql))
{
std::cout << "执行sql语句失败,错误信息为: " << mysql_error(&m_mysql) << endl;
return false;
}
else
{
std::cout << "执行sql语句成功!" << endl;
}
return true;
}
2、在数据库中删除数据
int main()
{
......
// 删除数据测试
const char* sql2 = "delete from user where name = 'sun'";
mysql.ExecuteSql(sql2);
......
return 0;
}
3、在数据库中修改数据
int main()
{
......
// 修改数据测试
const char* sql3 = "update user set grade='22' where name = 'wu'";
mysql.ExecuteSql(sql3);
......
return 0;
}
4、在数据库中查询数据
int main()
{
......
// 查询数据测试
const char* sql4 = "select * from user";
mysql.QueryData(sql4);
......
return 0;
}
// 查询数据
MYSQL_RES* MySQLManager::QueryData(const char* sql)
{
if (mysql_query(&m_mysql, sql))
{
std::cout << "查询语句执行失败,错误信息为: " << mysql_error(&m_mysql) << endl;
return nullptr;
}
else
{
std::cout << "查询语句执行成功!" << endl;
}
// 存储查询结果
m_res = mysql_store_result(&m_mysql);
return m_res;
}
5、打印数据库查询结果
// 遍历结果集
void MySQLManager::PrintQueryRes()
{
if (nullptr == m_res || NULL == m_res)
{
return;
}
// 字段列数组
MYSQL_FIELD* field = nullptr;
//存字段名二维数组
char fieldName[64][32];
// 获取字段名
for (int i = 0; field = mysql_fetch_field(m_res); ++i)
{
strcpy_s(fieldName[i], field->name);
}
// 获取列数
int columns = mysql_num_fields(m_res);
for (int i = 0; i < columns; ++i)
{
printf("%10s\t", fieldName[i]);
}
cout << endl;
//获取行数
MYSQL_ROW row;
while (row = mysql_fetch_row(m_res))
{
for (int i = 0; i < columns; ++i)
{
printf("%10s\t", row[i]);
}
cout << endl;
}
}
-----------------------------------------------------------------------------------------------------------------------------------------------------
如果本文对你有所帮助,请不要忘了点赞、收藏哦!!!
-----------------------------------------------------------------------------------------------------------------------------------------------------
参考文档
更多详细内容请查阅官方文档,网址如下:
MySQL官方网站:https://dev.mysql.com/doc/c-api/8.0/en/mysql-close.html