温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

mysql api的原理及用法是什么

发布时间:2021-11-17 16:11:38 来源:亿速云 阅读:102 作者:柒染 栏目:软件技术

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的原理及用法是什么的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI