mysql api的原理及用法是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
mysql api
数据类型
MYSQL
该结构代表1个数据库连接的句柄。几乎所有的MYSQL函数均使用它。
MYSQL_RES
该结构代表返回行的查询结果
MYSQL_ROW
这是1行数据的”类型安全”表示。
MYSQL_FIELD
该结构包含关于字段的信息,如字段名、类型和大小等
MYSQL_FIELD_OFFSET
这时MYSQL字段列表偏移量的”类型安全”表示
my_ulonglong
用于行数以及mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()的类型
编程步骤
1 通过调用mysql_library_init(),初始化MYSQL库(此步骤一般不用)
2 通过调用mysql_init()初始化连接处理程序,并通过调用mysql_real_connect()连接到服务器
3 发出SQL语句并处理其结果mysql_query()
注意: (1) 对于成功检索了数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必须调用mysql_store_result()或mysql_use_result() 。即查询需用到上面的函数处理
(2)释放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等为结果集分配的内存。完成对结果集的操作后,必须调用mysql_free_result()释放结果集使用的内存。
4 通过调用mysql_close(),关闭与MYSQL服务器的连接
5 通过调用mysql_library_end(),结束MYSQL库的使用(如果第一步省略,这一步可以省略)
数据库连接
初始化一个连接句柄结构
#include <mysql.h>
MYSQL mysql_init(MYSQL );
和数据库建立物理连接
MYSQL mysql_real_connect(MYSQL connection,
const char server_host,const char sql_user_name,
const char sql_password,const char db_name,
unsigned int port_number,const char
unix_socket_name,unsigned int flags);//此函数前面已经说过,这儿就不在细说
连接参数
int mysql_options(MYSQL mysql, enum mysql_option option, const char *arg)
可用于设置额外的连接选项,并影响连接的行为。可多次调用该函数来设置数个选项。
应在mysql_init()之后、以及mysql_connect()或mysql_real_connect()之前调用mysql_options()。
选项参量指的是你打算设置的选项。Arg参量是选项的值。如果选项是整数,那么arg应指向整数的值。
可能的选项值:
MYSQL_READ_DEFAULT_GROUP char *
从my.cnf或用MYSQL_READ_DEFAULT_FILE指定的文件中的命名组读取选项。
//此函数可以在用到时再去查手册
错误处理
unsigned int mysql_errno(MYSQL connection);
对于由mysql指定的连接,该函数返回最近调用的API函数的错误代码,该函数调用可能成功也可能失败。”0”返回值表示未出现错误
char mysql_error(MYSQL *connection)
如果想获得错误的文本信息,可以调用该函数
执行SQL语句
int mysql_query(MYSQL mysql,const char query)
功能描述:
执行由“Null终结的字符串”查询指向的SQL查询。正常情况下,字符串必须包含1条SQL语句,而且不应为语句添加终结分号(‘;’)或“\g”。如果允许多语句执行,字符串可包含多条由分号隔开的语句
mysql_query()不能用于包含二进制数据的查询,应使用mysql_real_query()取而代之(二进制数据可能包含字符‘\0’,mysql_query()会将该字符解释为查询字符串结束)。
如果希望了解查询是否应返回结果集,可使用mysql_field_count()进行检查
对于操纵语句
My_ulonglong mysql_affected_rows(MYSQL *mysql)
返回上次操纵语句所涉及到记录的行数
对于UPDATE、DELETE或INSERT语句,可在mysql_query()后立刻调用。对于SELECT语句,该函数的工作方式与mysql_num_rows()类似
对于查询语言
MYSQL_RES mysql_store_result(MYSQL mysql)
功能说明:
对于成功检索了数据的每个查询,必须调用mysql_store_result()或mysql_use_result()
该函数将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中
可以通过mysql_num_rows来找出结果集中的行数
处理结果集
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
功能描述
检索结果集的下一行。在mysql_store_result()之后使用时,如果没有要检索的行,mysql_fetch_row()返回NULL。在mysql_use_result()之后使用时,如果没有要检索的行或出现了错误,mysql_fetch_row()返回NULL。
行内值的数目由mysql_num_fields(result)给出。如果行中保存了调用mysql_fetch_row()返回的值,将按照row[0]到row[mysql_num_fields(result)-1],访问这些值的指针。行中的NULL值由NULL指针指明。
可以通过调用mysql_fetch_lengths()来获得行中字段值的长度。对于空字段以及包含NULL的字段,长度为0。通过检查字段值的指针,能够区分它们。如果指针为NULL,字段为NULL,否则字段为空。
返回值
下一行的MYSQL_ROW结构。如果没有更多要检索的行或出现了错误,返回NULL
每次接收一行数据
MYSQL_RES mysql_use_result(MYSQL mysql)
功能说明:
不像mysql_store_result()那样把结果集实际读取到客户端。它必须通过对mysql_fetch_row()的调用,对每一行分别进行检索。
mysql_store_result()相比,速度更快而且使用的内存更少
说明一下:mysql_store_result与mysql_use_result区别
mysql_store_result 会把数据库的数据缓存到本地,下次通过mysql_fetch_row从本地缓存中去读数据,而mysql_use_result只是建立了一个到数据库的链接,并没有缓存数据库数据,通过调用mysql_fetch_row每次都是从数据库去读数据
对于少量数据当然mysql_store_result效率更高,大量数据对的话最好用mysql_use_resut效率更高
看了这么久的api 怎么用呢? 请看下面的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>
////unsigned int mysql_errno(MYSQL *mysql)
int main()
{
int ret = 0; MYSQL mysql; MYSQL *connect = NULL; connect = mysql_init(&mysql) ; if (connect == NULL) { ret = mysql_errno(&mysql) ; printf("func mysql_init() err \n"); return ret; } printf("func mysql_init() ok \n"); connect = mysql_real_connect(connect, "localhost", "root", "mysql", "pos", 0, NULL, 0); if (connect == NULL) { ret = mysql_errno(&mysql) ; printf("func mysql_init() err \n"); return ret; } printf("func mysql_real_connect() ok \n"); //查询 const char *query = "select *from product"; ret = mysql_query(&mysql, query); if (ret != 0) { ret = mysql_errno(&mysql) ; printf("func mysql_query() err \n"); return ret; } //typedef char ** MYSQL_ROW; /* return data as array of strings */ //typedef unsigned int MYSQL_FIELD_OFFSET; /* offset to current field */ //获取结果集合 //结果集合中 可以含有10行数据 MYSQL_RES *result = mysql_store_result(&mysql); MYSQL_ROW row = NULL; while (row = mysql_fetch_row(result) ) { // 如何 获取 selct查询 有多少列? // 获取表头的函数? ... printf("%s, %s, %s, %s, %s, %s, %s, %s \n", row[0], row[1],row[2],row[3],row[4],row[5],row[6],row[7]); } mysql_free_result(result); mysql_close(&mysql); printf("hello...\n"); return ret;
}
看到这儿是否对MYSQL_ROW很晕呢?下面说一下他的原型,你就知道了
请看下面的模型
//二级指针 三种内存模型
//二级指针 从分配内存的 角度 输入和输出...
//typedef char * MYSQL_ROW; / return data as array of strings */
可以看到MYSQL_ROW 是一个二级指针
大概的原型如下
/*
char * mysql_fetch_row(MYSQL_RES res)
{
int i = 0;
char p = (char ) malloc(sizeof(char ) 7);//分配空间,假设有7列
for (i=0; i<7 ; i++)
{
p[i] = (char )malloc(100sizeof(char) );//再为每一列分配空间
strcpy(p[i], "aaaaaa") ;//拷贝数据库这列数据
}
return p;
}
另外一种改造:
int mysql_fetch_row(MYSQLRES *res, char *myp)
{
int i = 0;
char p = (char *) malloc(sizeof(char ) 7);
for (i=0; i<7 ; i++)
{
p[i] = (char )malloc(100*sizeof(char) );
strcpy(p[i], "aaaaaa") ;
}
myp = p;
}
/
// 如何 获取 selct查询 有多少列?
// 获取表头的函数?
看完上述内容,你们掌握mysql api的原理及用法是什么的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。