使用c语言连接数据库

c语言连接数据库

我们可以去mysql官网去下载mysql提供的客户端,使用C API来连接和操作数据库

下载好之后把压缩包弄进linux中

然后用tar命令解包,

item就是我解包后给目录修改的名字,你里面的东西和我不一样没关系,这个不重要,主要是,里面得有include和lib这两个目录,有这两个目录我们就可以使用mysql的头文件和动态库

我们要使用mysql的动态库和头文件,那就需要在编译的时候指定编译选项-I 指定头文件查找目录,-L指定库文件查找目录,-l指定链接的库

mysql的C语言接口介绍

1、mysql_int

cpp 复制代码
MYSQL * mysql_init(MYSQL *mysql)

一般是MYSQL *mfp = mysql_init(NULL)获得一个MYSQL句柄

2、mysql_real_connect

cpp 复制代码
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)

mysql:前面mysql_init创建的句柄,使用mysql_real_connect来进行初始化

host:mysqld服务器的ip

user:用户名

db:要操作的数据库

port:mysqld服务器的监听端口

后面两个参数直接为nullptr和0即可

3、mysql_query

cpp 复制代码
int mysql_query(MYSQL *mysql, const char *q);

q**:**sql语句,可以是增删查改中的任何一种,甚至begin、commit这些也不在话下

mysql_query的返回值是0那么就是成功,如果返回值是其他那就是出错

假如是增删改这种sql语句,执行了也就执行了,我们只需要通过返回值看看是否执行成功,不要出错,但是如果是查,那返回值哪怕是执行成功,我们也无法得到查询结果呀,所以下面的函数全部都是为查询结果而生的

4、mysql_store_result

cpp 复制代码
MYSQL_RES *mysql_store_result(MYSQL *mysql);

使用mysql_query进行select后,查询结果会保存进MYSQL中,我们可以用mysql_store_result来将查询结果弄到MYSQL_RES中

5**、mysql_num_rows**

cpp 复制代码
my_ulonglong mysql_num_rows(MYSQL_RES *res);

获取结果行数

6、mysql_num_fields

cpp 复制代码
unsigned int mysql_num_fields(MYSQL_RES *res);

获取字段数,也就是列数

7、mysql_fetch_fields

cpp 复制代码
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);

返回字段数组的第一个元素MYSQL_FIELD的地址

cpp 复制代码
typedef struct st_mysql_field {
  char *name;                 /* 字段名 */
  char *org_name;             /* 原始字段名(如有别名) */
  char *table;                /* 字段所属的表名 */
  char *org_table;            /* 原始表名(如有别名) */
  char *db;                   /* 字段所属的数据库名 */
  char *catalog;              /* 目录名(通常为 "def") */
  char *def;                  /* 默认值(如果有) */
  unsigned long length;       /* 字段长度(定义时的长度) */
  unsigned long max_length;   /* 查询结果中的最大长度 */
  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;         /* 字段标志(如 NOT_NULL_FLAG) */
  unsigned int decimals;      /* 小数位数(用于数值类型) */
  unsigned int charsetnr;     /* 字符集编号 */
  enum enum_field_types type; /* 字段类型(如 MYSQL_TYPE_VARCHAR) */
  void *extension;
} MYSQL_FIELD;

8、mysql_fetch_row

cpp 复制代码
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **,在mysql.h中定义为typedef char **MYSQL_ROW;
char**是char*数组的第一个元素的地址,每个char*指向一行数据的一个字段,char*数组整个就可以指向一行数据
mysql_fetch_row每次使用会自动往后走,返回下一行数据的char**
9、mysql_close
void mysql_close(MYSQL *sock);
MYSQL管理着众多数据,所以要mysql_close进行释放资源

示例代码:

cpp 复制代码
#include <iostream>
#include <mysql.h>
#include <string>

const std::string host="192.168.217.132";
const std::string user = "connector";
const std::string password="Aa123456.";
const std::string database="conn";
int port=3306;

int main()
{

  //std::cout<<"mysql version:"<<mysql_get_client_info()<<std::endl;
  
  MYSQL* mysql=mysql_init(nullptr);
  mysql_real_connect(mysql,host.c_str(),user.c_str(),password.c_str(),database.c_str(),port,nullptr,0);
 
  if(mysql==nullptr)
  {
    std::cout<<"连接数据库失败"<<std::endl;
  }
  else
  {
    std::cout<<"连接数据库成功"<<std::endl;
  }

  mysql_query(mysql,"select * from user;");
  MYSQL_RES* res=mysql_store_result(mysql);
  int rows= mysql_num_rows(res);
  int clos= mysql_num_fields(res);

  MYSQL_FIELD* fields =mysql_fetch_fields(res);
  for(int i=0;i<clos;i++)
  {
    std::cout<<fields[i].name<<" ";
  }
  std::cout<<std::endl;
  
  for(int i=0;i<rows;i++)
  {
    MYSQL_ROW row= mysql_fetch_row(res);
    for(int j=0;j<clos;j++)
    {
      std::cout<<row[j]<<" ";
    }
    printf("\n");
  }
  mysql_close(mysql);
  return 0;
}
相关推荐
奥尔特星云大使2 小时前
mysql重置管理员密码
linux·运维·数据库·mysql·centos
Lbwnb丶2 小时前
p6spy 打印完整sql
java·数据库·sql
奥尔特星云大使3 小时前
MySQL多实例管理
linux·运维·数据库·mysql·dba·mysql多实例
ヾChen3 小时前
初识MySQL
数据库·物联网·学习·mysql
牛奶咖啡133 小时前
高可用MySQL的整体解决方案、体系化原理和指导思路
数据库·mysql·主从复制·高可用mysql解决方案·双主复制·mha高可用·全同步和半同步复制
wow_DG3 小时前
【MySQL✨】MySQL 入门之旅 · 第十一篇:常见错误排查与解决方案
数据库·mysql·adb
博睿谷IT99_4 小时前
GaussDB 和 openGauss 怎么区分?
数据库·华为认证·opengauss·it·gaussdb
野犬寒鸦5 小时前
今日面试之快问快答:Redis篇
java·数据库·redis·后端·缓存·面试·职场和发展
思茂信息5 小时前
CST微波混频电路 --- 频线任务,谐波平衡(Harmonic Balance)
数据库·3d·负载均衡·软件工程·cst·电磁仿真