目录
一,连接数据库
1,头文件和库
头文件 :
#include<mysql/mysql.h>
库:
mysqlclient
gcc xxx.c -lmysqlclient
2,连接数据库的相关函数
mysql_init
函数原型: MYSQL *mysql_init ( MYSQL *mysql )
功能: 分配或初始化 MYSQL 对象,如果 mysql 为空指针,返回一个新对象
否则初始化对象,调用mysql_close() 来关闭连接。
返回值: 初始化的 MYSQL 句柄 失败则返回 NULL 。mysql_real_connect
函数原型:
MYSQL *mysql_real_connect(
MYSQL *mysql, //已有MYSQL结构的地址
const char *host , //主机名或 IP 地址
const char *user , //登录名
const char *passwd , // 密码
const char *db , // 数据库名称
unsigned int port , // 端口号 默认 0
const char unix_socket , // 套接字或命名管道 默认NULL
unsigned long client_flag // 一般为 0
)
功能:连接数据库
返回值: 连接成功,返回 MYSQL 句柄,连接失败,返回 NULL。mysql_close
函数原型: void mysql_close(MYSQL *mysql)
功能:关闭前面打开的连接,如果句柄是由 mysql_init() 分配的,该函数还将解除分配 给mysql指向的连接句柄。
返回值: 无。
3,错误处理相关函数
mysql_errno
函数原型: unsigned int mysql_errno(MYSQL *mysql)
功能:对于由mysql指定的连接,mysql_errno()返回最近调用的API函数的错误代码
返回值: 如果失败,返回上次mysql_xxx()调用的错误代码,没有错误返回0.mysql_error
函数原型: const char * mysql_error(MYSQL *mysql)
功能:对于由mysql指定的连接,对于失败的最近调用的API函数,mysql_error()返回
包含错误信息的,由NULL结束的字符串,如果该函数未失败,该函数的返回值
可能是以前的错误,或指明无错误的空字符串。
返回值: 返回描述错误的,由NULL结尾的字符串,如果未出现错误,返回空字符串。
4,连接数据库以及错误处理示例
// An highlighted block
#include<stdio.h>
#include<mysql/mysql.h>
int main()
{
MYSQL mysql;
mysql_init(&mysql); //初始化MYSQL结构
//连接数据库
if(!(mysql_real_connect(&mysql,"localhost","root","tarena","choose",0,NULL,0)))
{
printf("连接失败\n");
printf("错误号:%d\ : %sn",mysql_errno(&mysql),mysql_error(&mysql));
}
mysql_close(&mysql); //关闭数据库
}
二,DML操作
1,相关函数
mysql_query
函数原型: int mysql_query(MYSQL *mysql , const char *query)
功能: 执行“ NULL结束的字符串 ” 指向 SQL 语句。
返回值: 成功为 0 ,mysql_affected_rows
函数原型: my_ulonglong mysql_affected_rows (MYSQL *mysql)
功能: 返回上次 insert ,update , delete 语句影响的行数
返回值: 大于 0 的整数表明受影响或检索的行数。 0 表示未更新记录, -1 表示查询返回错误。
2,insert操作
- 向student表中插入一条数据,
// An highlighted block
#include<mysql/mysql.h>
MYSQL* mysql;
mysql = mysql_init(NULL);
mysql = mysql_real_connect(mysql,"","root","tarena","choose",0,NULL,0);
mysql_query(mysql,"set character set utf8");
mysql_query(mysql,"insert into student values('20171001','小李',‘13512345678’,‘NULL’)");
mysql_close(mysql);
2,update操作
mysql_query(mysql,“set character set utf8”);
sprintf(sqlstr, "update student set student_name = ’ %s ‘, student_contact = ’ %s’ , class_no = %d where student_no = ’ %s ’ " , stu_name , phone , c_no , stu_no );
mysql_query (mysql , sqlstr) ;
num_rows = mysql_affected_rows (mysql);
三,SELECT操作
1,相关函数
mysql_store_result
函数原型: MYSQL_RES *mysql_store_result (MYSQL *mysql)
功能: 对于成功检索了数据的操作(select , show , describe 等),必须调用
mysql_store_result() 或 mysql_use_result()。 对于其他操作,不需要
调用这两个函数。
mysql_store_result() 将查询的全部结果读取到客户端。
返回值: 成功时,返回 MYSQL_RES 结果集。出错时,返回NULLmysql_free_result
函数原型: void mysql_free_result (MYSQL_RES *result)
功能: 释放由 mysql_store_result() , mysql_use_result() , mysql_list_dbs()
等为结果集分配的内存。完成对结果集的操作后,必须调用mysql_free_result
释放结果集使用的内存。释放完成后,不要尝试访问结果集
返回值: 无mysql_num_fields
函数原型: unsigned int mysql_num_fields (MYSQL_RES *res)
功能: 返回结果集中的列数
返回值: 表示结果集中列数的无符号数mysql_fetch_fields
函数原型: MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res)
功能: 对于结果集,返回所有 MYSQL_FIELD 结构的数组。每个结构提供了结果集中
一列的字段定义。
返回值: 关于结果集所有列的 MYSQL_FIELD 结构的数组
MYSQL_FIELD 结构:该结构包含关于字段的信息,如字段名,类型和大小
主要成员:name, org_name , tables , db …mysql_fetch_row
函数原型: MYSQL_ROW mysql_fetch_row (MYSQL_RES *res)
功能: 检索结果集的下一行
返回值: 下一行的 MYSQL_ROW 结构。如果没有更多要检索的行或出现了错误,
返回NULL
// An highlighted block
MYSQL mysql;
MYSQL_RES *res; //结果集
unsigned int num_fields; //列数
unsigned int num_rows; //行数
MYSQL_FIELD* fields; //列的信息
mysql_init(&mysql);
if(!(mysql_real_connect(&mysql,"localhost","root","tarena0","choose",0,NULL,0)))
{
return;
}
mysql_query(&mysql,"select * from student");
res = mysql_store_result(&mysql); //获取结果集
if(res)
{
num_fields = mysql_num_fields(res); //列数
num_rows = mysql_num_rows(res); //行数
printf("列数:%d , 行数:%d \n",num_fields , num_rows);
fields = mysql_fetch_fields(res); //获取消息的结构体数组
printf("成功获取结果\n");
}
mysql_free_result(res); //释放结果集
mysql_close(&mysql);
return 0;