1. 概述:
在C语言中,使用MySQL的C API库可以实现与MySQL数据库的连接。MySQL C API是使用MySQL应用程序开发的标准API,提供了一个连接MySQL的接口,通过这个接口可以实现对MySQL的访问,比如执行MySQL语句,读取MySQL中的数据等。
以下是在C中连接MySQL数据库的基本步骤:
引入MySQL C API库头文件
使用MySQL C API库中的函数链接MySQL数据库
使用SQL语句执行MySQL操作或读取MySQL数据库中的内容
关闭MySQL连接
2. 引入MySQL C API库头文件
在进行MySQL数据库连接和操作前,需要先引入MySQL C API库的头文件,头文件名称为:mysql.h。
#include<mysql.h>
3. 链接MySQL数据库
3.1 初始化MySQL
在进行MySQL连接前,需要先对MySQL进行初始化。可以使用mysql_init()函数对MySQL进行初始化,并返回一个MYSQL连接实例。
MYSQL *mysql_init(MYSQL *mysql);
其中,参数mysql是一个已经初始化了的MYSQL连接实例。如果该实例为NULL,则初始化失败。
例如,在连接MySQL数据库前,先进行MySQL初始化,代码如下:
MYSQL *conn=mysql_init(NULL);
if(conn==NULL)
{
printf("MySQL 初始化失败");
}
3.2 链接MySQL服务器
链接MySQL服务器采用mysql_real_connect()函数,该函数的定义如下:
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 clientflag);
函数参数解释如下:
mysql:mysql_init()函数返回的MYSQL连接实例指针。
host:MySQL服务器地址,如果是本地,则为localhost。
user:MySQL用户名。
passwd:MySQL用户密码。
db:MySQL数据库名称。
port:MySQL服务器端口号,默认为3306。
unix_socket:使用UNIX域套接字连接MySQL服务器时的路径。如果使用TCP/IP,必须设置为NULL。
clientflag:连接MySQL服务器时使用的选项。
例如:
MYSQL *conn=mysql_init(NULL);
if(conn==NULL)
{
printf("MySQL 初始化失败");
}
const char *server = "localhost";
const char *user = "root";
const char *password = "123456";
const char *database = "test";
unsigned int port = 3306;
if(mysql_real_connect(conn,server,user,password,database,port,NULL,0)==NULL)
{
printf("连接MySQL失败:%s",mysql_error(conn));
}
4. 执行MySQL操作或读取MySQL数据库中的内容
在成功链接MySQL之后,就可以执行MySQL语句来操作MySQL数据库或读取MySQL数据库中的数据了。
4.1 执行MySQL语句
MYSQL_QUERY()函数可以用于执行任何类型的SQL语句,但一般都是用来执行SELECT、INSERT、UPDATE等类型的SQL语句。
int mysql_query(MYSQL *mysql,const char *stmt_str);
函数参数解释如下:
conn:mysql_real_connect()函数返回的指针。
stmt_str:要执行的SQL语句。
执行成功时,该函数返回0,否则返回非0值。
例如,执行一条SELECT语句:
char *sql = "SELECT * FROM `table1`";
if(mysql_query(conn,sql)!=0)
{
printf("执行SQL语句错误:%s",mysql_error(conn));
}
4.2 读取MySQL数据库中的数据
为了从MySQL数据库中读取数据,需要先将数据存储在MYSQL_RES结构体中。MYSQL_RES结构体包含了查询结果的全部信息。
当使用mysql_query()函数执行SELECT语句时,结果集指针将返回一个MYSQL_RES结构体指针。可以使用mysql_store_result()函数将结果集存储在MYSQL_RES结构体中。
MYSQL_RES *mysql_store_result(MYSQL *mysql);
例如,如下代码将对前面例子中的SELECT语句进行结果集处理:
MYSQL_RES *res;
res=mysql_store_result(conn)
if(res==NULL)
{
printf("获取结果集错误:%s",mysql_error(conn));
}
4.3 读取结果集
一旦查询的结果集存储在MYSQL_RES结构体中,就可以使用mysql_fetch_row()函数读取每一行数据。该函数返回值是一个代表结果集当前行的字符串数组。
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
例如,如下代码读取结果集中的数据:
MYSQL_ROW row;
unsigned long *lengths;
while((row=mysql_fetch_row(res))!=NULL)
{
lengths=mysql_fetch_lengths(res);
for(int i=0;i
{
printf("%.*s ",lengths[i],row[i]?row[i]:"NULL");
}
printf("\n");
}
5. 关闭MySQL连接
在完成对MySQL数据库的操作后,需要手动关闭MySQL连接。可以使用mysql_close()函数来关闭MySQL连接。
void mysql_close(MYSQL *mysql);
例如,如下代码关闭MySQL连接:
mysql_close(conn);
6. 示例代码
将上面的步骤结合起来,以下是一个简单的MySQL连接示例:
#include <mysql.h>
#include <stdio.h>
int main()
{
MYSQL *conn = mysql_init(NULL);
if(conn==NULL)
{
printf("MySQL 初始化失败");
return 1;
}
const char *server = "localhost";
const char *user = "root";
const char *password = "123456";
const char *database = "test";
unsigned int port = 3306;
if(mysql_real_connect(conn,server,user,password,database,port,NULL,0)==NULL)
{
printf("连接MySQL失败:%s",mysql_error(conn));
return 1;
}
char *sql = "SELECT * FROM `table1`";
if(mysql_query(conn,sql)!=0)
{
printf("执行SQL语句错误:%s",mysql_error(conn));
return 1;
}
MYSQL_RES *res;
res=mysql_store_result(conn);
if(res==NULL)
{
printf("获取结果集错误:%s",mysql_error(conn));
return 1;
}
MYSQL_ROW row;
unsigned long *lengths;
while((row=mysql_fetch_row(res))!=NULL)
{
lengths=mysql_fetch_lengths(res);
for(int i=0;i<mysql_num_fields(res);i++)
{
printf("%.*s ",lengths[i],row[i]?row[i]:"NULL");
}
printf("\n");
}
mysql_close(conn);
return 0;
}