mysql C API简单使用及例子参考

24 篇文章 0 订阅
1 篇文章 0 订阅

centos7 下通过yum 安装 mysql 点击这里参考

mysql API 参考:

1.初始化mysql句柄

MYSQL *mysql init( MYSQL *mysql );
通常参数为NULL,表示要动态分配一块空间进行初始化

2.连接mysql服务器

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)
返回值: 返回句柄的空间首地址; 出错返回 NULL

mysql:初始化完成的句柄; 
host: 要连接的mysql服务器IP; 
user: mysql数据库用户名;
passwd:数据库访问密码
db:默认要选择使用的数据库名称;
port: mysql服务端口,0默认表示3306端口; 
unix_socket:指定socket或管道,通常为NULL
client_flag:一些选项操作标志位,通常置0;

3.设置客户端字符编码集

int mysql_set_character_set(MYSQL *mysql, const char *csname)
返回值: 成功返回0, 失败返回非0

mysql: mysql句柄; 
csname:字符编码集名称,通常置为utf8

例子:

MYSQL mysql; // 定义句柄类型变量
mysql_init(&mysql); // 进行初始化
if (!mysql_real_connect(&mysql, "host","user"," passwd"," database",0,NULL,0))
{
    fprintf(stderr, "Failed to connect to database: Error: %s\n",
    mysql_error(&mysql));
}
if (!mysql_set_character_set(&mysql, "utf8"))
{
    printf("New client character set: %s\n",
    mysql_character_set_name(&mysql));
}

4.选择使用的数据库

int mysql_select_db(MYSQL *mysql, const char* db)
返回值: 成功返回0, 失败返回非0

mysql: 句柄;
db: 数据库名称

5.表以及其中数据的各项操作(执行语句)

int mysql_query(MYSQL *mysql, const char *stmt_str)
返回值:成功返回0;失败返回非0

mysql:操作句柄;
stmt_str:要执行的sql语句
插入以及修改以及删除三个操作,只要语句执行成功,操作就完成,
但是查询不一样,语句执行成功后,需要获取结果

6.从远程服务器获取结果集()

MYSQL_RES *mysql_store_result(MYSQL *mysql) ---将查询结果获取到本地
返回值: 成功返回句柄, 失败返回null
mysql: mysql句柄
uint64_t mysql_num_rows(MYSQL_RES *result) ---获取结果集中结果的条数
unsigned int mysql_num_fields(MYSQL_RES *result) ---获取结果集中结果的列数
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result) ---遍历结果集,每次获取一条/行数据
(不会重复, 内部有读取位置维护) 
MYSQL_ROW 是一个 char** 二级指针, MYSQL_ROW row; row[0]表示第0列数据, 
(注意: 结果集中的结果都是字符串(与数据原类型无关))

void mysql_free_result(MYSQL RES *result) ---释放 结果集 空间
(不释放就会造成资源泄露)

7.关闭数据库释放资源

void mysql_close(MYSQL *mysql);

8.获取mysql接口调用失败原因

char *mysql_error(MYSQL *mysql);

流程: 12个接口
初始化: mysq_init;
连接服务器: mysql_real_connect;
设置字符集:mysql_set_character_set;
选择数据库: mysql_select_db
执行语句: mysql_query;
保存结果集: mysql_store_result;
获取结果行数: mysql_num_rows;
获取结果列数:mysql_num_fields
遍历结果: mysql_fetch_row;
释放结果集: mysql_free_result;
关闭数据库: mysql_close;
获取接口错误原因: mysql_error

编写简单C代码使用 mysql数据库
注意 : 编译时需要链接库

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<mysql/mysql.h>

int main(){
  MYSQL *mysql = mysql_init(NULL);
  if(mysql == NULL){
    printf("init mysql error\n");
    return -1;
  }
  // 连接服务器
  if(mysql_real_connect(mysql, "172.16.141.156","root","","db_blog",0,NULL,0) == NULL){
    printf("connect mysql server failed:%s\n", mysql_error(mysql));
    return -1;
  }
  // 设置客户端字符集
  if(mysql_set_character_set(mysql, "utf8") != 0){
    printf("set character failed:%s\n", mysql_error(mysql));
    return -1;
  }
  // 选择切换使用的数据库
  if(mysql_select_db(mysql, "db_blog") != 0){
    printf("select db failed: %s\n", mysql_error(mysql));
    return -1;
  }

  // 创建表
  // 多个语句进行实验
  //   //char* sql_str = "create table if not exists tb_stu(id int,name varchar(32), info text, score decimal(4,2), birth datetime);";
  char *sql_str = "insert tb_stu values(1,'张三','真的好帅',99.456,'2002-02-28 12:00:00');";
  //char *sql_str = "update tb_stu set name='李四',info='没有头发是个大佬' where name='张三' ;";
  //char *sql_str = "delete from tb_stu where name= '张三';";
  int ret = mysql_query(mysql, sql_str);
  if(ret != 0){
    printf("query sql failed: %s\n", mysql_error(mysql));
    return -1;
  }

  char *sql = "select * from tb_stu;";
  int ret1 = mysql_query(mysql, sql);
  if(ret1 != 0){
    printf("query sql failed: %s\n", mysql_error(mysql));
    return -1;
  }
  MYSQL_RES *res = mysql_store_result(mysql);
  if(res == NULL){
    printf("store result failed: %s\n", mysql_error(mysql));
    return -1;
  }
  int num_row = mysql_num_rows(res); // 行数
  int num_col = mysql_num_fields(res); // 列数
  int i = 0;
  for(int i = 0; i < num_row; ++i){
    // res中 有读取位置控制, 每次获取的都是下一条数据
    MYSQL_ROW row = mysql_fetch_row(res);
    for(int j = 0; j < num_col; ++j){
      printf("%s\t", row[j]);
    }
    printf("\n");
  }
  mysql_free_result(res);// 获取了结果集,使用完毕, 需要释放, 否则会造成内存泄漏
  mysql_close(mysql);
  return 0;
}

gcc test.c -o test -lmysqlclient 依然报错, 因为 库文件 在 usr/lib64/mysql 路径下, 没有直接在 lib64目录下, 所以需要指定 库文件路径:

gcc test.c -o test -L/usr/lib64/mysql -lmysqlclient

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值