MySQL数据库c语言接口

目录

提问:

        1.MySQL数据库提供的接口有哪些?

        2.如何通过c语言使用数据库?

1.MySQL数据库提供的接口有哪些?

1.1 综述

1.1.1 主要流程

1.1.2 mysql_init()

1.1.3 mysql_real_connect()

1.1.4 mysql_query()

1.1.5 mysql_store_result()、mysql_use_result()


提问:

        1.MySQL数据库提供的接口有哪些?

        2.如何通过c语言使用数据库?

1.MySQL数据库提供的接口有哪些?

1.1 综述

1.1.1 主要流程

  1. 数据库结构体初始化:mysql_init()
  2. 数据库的连接(登录 数据库):mysql_real_connect()
  3. 对数据库的操作:mysql_query()
  4. 读取操作返回的数据:mysql_store_result(),mysql_fetch_fields() ,  mysql_num_fields() ,  mysql_fetch_row()  , mysql_free_result()
  5. 关闭与数据库的连接 :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()

重要的结构体:(下方链接)

MySQL官方文档——数据结构

头文件:

#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 execute mysql_fetch_row() until a NULL value is returned, otherwise, the unfetched rows are returned as part of the result set for your next query. The C API gives the error Commands 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;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章