MySQL:C语言链接
目录
mysql接口介绍
mysql_init
mysql_real_connect
mysql_query
mysql_store_result
mysql_num_rows
mysql_num_fields
mysql_fetch_fields
mysql_fetch_row
mysql_close
mysql接口介绍
以下mysql的接口并非线程安全,多线程里要么各自调用各自的函数,要么加锁
mysql_init
MYSQL *mysql_init(MYSQL *mysql);
返回值:
该函数会返回一个mysql句柄
参数:
若参数为nullptr,则库自动分配一个mysql句柄(常用)
MYSQL *conn = mysql_init(NULL);
或者自己创建一个MYSQL变量传递进去自己进行管理
MYSQL m;
MYSQL *conn = mysql_init(&m);
mysql_real_connect
MYSQL *mysql_real_connect(MYSQL *mysql, // mysql_init 返回的句柄const char *host, // 主机名或 IP,NULL = localhostconst char *user, // 用户名const char *passwd, // 密码,NULL = 空密码const char *db, // 默认库,NULL = 不选库unsigned int port, // 端口,0 = 3306const char *unix_socket, // Unix socket 路径,NULL = 自动unsigned long client_flag // 位标记,0 即可
);
mysql_real_connect()是MySQL C API里真正建立TCP/IP连接的函数
返回值:
成功:返回与传入相同的MySQL*指针(后续所有 SQL 都靠它)
失败:返回NULL
port设为0表示用库默认3306
mysql_query
int mysql_query(MYSQL *mysql, const char *stmt_str);
mysql_query()负责下发mysql命令
mysql:mysql句柄(可通过mysql_init()获得)
例如:
mysql_query(conn, "SELECT id, name FROM user WHERE age > 18")
返回值:
成功:返回0
失败:返回非0
mysql_query()只负责发,不关心结果集(如果是查询语句则需要关心结果集)
想获取数据还需要继续调用mysql_store_result()
mysql_store_result
MYSQL_RES *mysql_store_result(MYSQL *mysql);
mysql_store_result()函数是一次性把查询结果从服务器全部拉到客户端内存
返回值:
返回一个MYSQL_RES*结果集句柄(后续可以用mysql_fetch_row()遍历)
这是拿到SELECT结果的最常用方式
mysql_num_rows
my_ulonglong mysql_num_rows(MYSQL_RES *result);
该函数用于获取结果行数
传入一个结果集句柄,返回结果行数
mysql_num_fields
unsigned int mysql_num_fields(MYSQL_RES *result);
该函数用于获取结果列数
传入一个结果集句柄,返回结果列数
mysql_fetch_fields
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result);
该函数主要是一次性拿到结果集所有列的元数据数组,可直接用下标访问每一列的信息(名字、类型、长度、精度、是否主键…)
经典用法:
int fields = mysql_num_fields(res);
MYSQL_FIELD *field = mysql_fetch_fields(res);
int i = 0;
for(; i < fields; i++)
{cout << field[i].name << " ";
}
cout << endl;
mysql_fetch_row
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
该函数是逐行读取结果集数据的核心函数
mysql_fetch_row()函数内部有一个“行游标”,每次调用就把这个游标向下移动一行,并返回刚指向的那一行的地址,游标到尾巴后就返回NULL,循环结束
返回值:
成功返回指向字符串数组的指针,下标对应列号,结束返回NULL(MYSQL_ROW其实就是char**,当成二维数组使用)
经典用法:
i = 0;
MYSQL_ROW line;
for(; i < nums; i++)
{line = mysql_fetch_row(res);int j = 0;for(; j < fields; j++){cout << line[j] << " ";}cout << endl;
}
mysql_close
void mysql_close(MYSQL *mysql);
该函数用于关闭mysql链接
和malloc后需要free一样
完