使用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 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸2 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain2 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希3 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神3 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员3 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java3 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿3 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴4 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存
YOU OU4 小时前
三大范式和E-R图
数据库