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;
}
