目录
1.1.5 mysql_store_result()、mysql_use_result()
提问:
1.MySQL数据库提供的接口有哪些?
2.如何通过c语言使用数据库?
1.MySQL数据库提供的接口有哪些?
1.1 综述
1.1.1 主要流程
- 数据库结构体初始化:mysql_init()
- 数据库的连接(登录 数据库):mysql_real_connect()
- 对数据库的操作:mysql_query()
- 读取操作返回的数据:mysql_store_result(),mysql_fetch_fields() , mysql_num_fields() , mysql_fetch_row() , mysql_free_result()
- 关闭与数据库的连接 :mysql_close()
-
在linux中构建的Makefile工程要安装 libmysqlclient-dev 才能使用API接口的头文件。
命令:sudo apt-get install libmysqlclient-dev -
安装好后的头文件在:/usr/include/mysql
-
编译模板为
gcc query.c -o query_mysql -I /usr/include/mysql/ -lmysqlclient
1.1.2 mysql_init()
MYSQL *mysql_init(MYSQL *mysql);
初始化MYSQL结构体。
1.1.3 mysql_real_connect()
重要的结构体:(下方链接)
头文件:
#include <mysql/mysql.h>
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结构体。
参数host为一个字符串,可以为主机名或ip地址
为NULL或"localhost",与本地主机连接。在Unix上,客户端使用Unix套接字文件进行连接。
参数user指定登录的用户名
参数passwd指定登录的密码
参数db指定登录的数据库
参数port指定使用的端口号,如果port不为0,则该值用作TCP / IP连接的端口号。
参数unix_socket 不为NULL,指定要使用的套接字或命名管道。可以为NULL。
参数client_flag用来开启某些特殊功能,一般为0
1.1.4 mysql_query()
int mysql_query(MYSQL *mysql, const char *stmt_str);
执行以null结尾的字符串指向的SQL语句stmt_str。通常,字符串必须由单个SQL语句组成,而不包含终止分号(;)或\g。
成功返回0,执行错误返回非0 。
1.1.5 mysql_store_result()、mysql_use_result()
MYSQL_RES *mysql_use_result(MYSQL *mysql);
MYSQL_RES *mysql_store_result(MYSQL *mysql);
获得结果集
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
从结果集中,取出一行
void mysql_free_result(MYSQL_RES *result);
释放结果集,方便下一次使用。
不释放,下次使用会失败。
- mysql_use_result()启动结果集检索,但实际上并没有将结果集读取到客户端中,mysql_store_result()也是一样的。相反,必须通过调用来mysql_fetch_row()单独检索每一行。这会直接从服务器读取查询结果,而不会将其存储在临时表或本地缓冲区中,这样会更快并且使用的内存要少得多。客户端仅为当前行和可能长到
max_allowed_packet
字节的通信缓冲区分配内存 。 - When using
mysql_use_result()
, you must executemysql_fetch_row()
until aNULL
value is returned, otherwise, the unfetched rows are returned as part of the result set for your next query. The C API gives the errorCommands out of sync; you can't run this command now
if you forget to do this! - 先给一个例子吧!有下面的例子可只只需要改变query里的命令既可以实现增删查改。
#include <mysql/mysql.h>
#include <stdio.h>
#include <string.h>
int main(int argc,char* argv[])
{
if(argc!=2)
{
printf("error args\n");
return -1;
}
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
char* server="localhost";
char* user="root";
char* password="123";
char* database="test"; //要访问的数据库名称
char query[300]="select * from person where name='";
sprintf(query,"%s%s%s",query, argv[1],"'");
puts(query);
int t;
//初始化conn
conn=mysql_init(NULL);
//建立与数据库的连接
if(!mysql_real_connect(conn,server,user,password,database,0,NULL,0))
{
printf("Error connecting to database:%s\n",mysql_error(conn));
return -1;
}else{
printf("Connected...\n");
}
//通过query中语句,查询消息
t=mysql_query(conn,query);
if(t)
{
printf("Error making query:%s\n",mysql_error(conn));
}else{
//得到结果集
res=mysql_use_result(conn);
if(res)
{
printf("use result\n");
//循环读取每一行,为NULL就退出
while((row=mysql_fetch_row(res))!=NULL)
{
//printf("num=%d\n",mysql_num_fields(res));//获取列数
for(t=0;t<mysql_num_fields(res);t++)
{
printf("%8s ",row[t]);
}
printf("\n");
}
}else{
printf("Don't find data\n");
}
//释放结果集,不然无法保证再次使用
mysql_free_result(res);
}
//关闭数据库连接
mysql_close(conn);
return 0;
}