Linux程序设计 学习笔记 第八章 MySQL(部分)

用C语言连接MySQL包含两个步骤:
1.初始化一个连接句柄结构。
2.实际进行连接。

初始化连接句柄:
在这里插入图片描述
通常传递NULL给此例程,它返回一个指向新分配的连接句柄结构的指针。如果传递一个已有的结构,它将被重新初始化。mysql_init函数出错时返回NULL。

分配和初始化一个句柄后,需要调用mysql_real_connect向一个连接提供参数:

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);

参数connection必须指向被mysql_init函数初始化过的结构。

参数server_host既可以是主机名,也可以是IP地址,如果是连接到本地机器,可通过指定localhost或NULL(两者含义相同)来优化连接类型,优化后,将使用套接字(UNIX)或命名管道(Windows)而非TCP/IP连接到数据库。

如果数据库登录名参数sql_user_name为NULL,则假设登录名为当前Linux用户的登录ID;如果数据库密码参数sql_password为NULL,那么只能访问服务器上无需密码就能访问的内容。

MySQL端口号port_name和unix_socket_name参数应该分别为0和NULL,除非改变了MySQL的默认设置,它们将默认使用合适的值。参数unix_socket_name指定使用的套接字或命名管道。

flags参数改变使用协议的某些特性。

使用完连接后,通常在程序退出时,要调用:
在这里插入图片描述
如果参数connection是由mysql_init函数建立的,MySQL结构会被释放,指针将会失效并无法再次使用。保留一个不需要的连接是对资源的浪费,而重新打开连接会带来额外开销,要权衡何时使用mysql_close函数。

MySQL错误处理函数使用一系列由连接句柄结构报告的返回码:
在这里插入图片描述
在这里插入图片描述
可调用mysql_errno并传递连接句柄结构来获得错误码,它通常是非0值,如没有设定错误码,则返回0,每次调用库函数(除了以上两个错误检查例程)都会更新错误码,因此只能得到最后一个执行命令的错误码。

错误码定义在头文件errmsg.h或mysqld_error.h中,前者报告客户端错误,后者关注服务器端错误。

mysql_error函数返回文本错误信息,这些信息被写入内部静态内存空间中,因此如果想保存错误文本,需要把它复制到别的地方。

执行sql语句的API:
在这里插入图片描述
参数query是不带分号的有效sql语句文本串。成功时,函数返回0。对于包含二进制数据的查询,可使用mysql_real_query函数。

对于不返回任何数据的sql语句,如update、delete、insert,检查受sql影响的行数:
在这里插入图片描述
此函数的返回类型在printf时,推荐使用%ul格式将其转换成无符号长整型。这个函数返回受之前没有返回值的sql语句影响的行数。MySQL返回的是一个被更新操作修改的行数,但其他许多数据库仅因为某行记录匹配where字句就把它视为已更新过。

在C应用程序中提取数据库数据分以下步骤:
1.执行查询。
2.提取数据。
3.处理数据。
4.必要的清理工作。

先用mysql_query函数发送sql语句,之后可以使用mysql_use_result(一次返回一行数据)或mysql_store_result(一次返回所有结果)函数来提取数据,结果集比较小时,后者比较合适。

在这里插入图片描述
此函数将返回所有查询到的数据,它返回一个指向结果集结构的指针,如果执行失败,则返回NULL。

mysql_store_result成功调用后,需要调用mysql_num_rows来得到返回记录的数目,一般是一个正数,如果没有返回行,mysql_num_rows函数将返回0。

在这里插入图片描述
如果mysql_store_result调用成功,则mysql_num_rows函数始终返回成功。

如果查询结果是一个特别庞大的数据集,最好提取小一些、更易管理的信息块,这样可以更快地将控制权返回给应用程序,且不会占用大量网络资源。

现在,可以调用mysql_fetch_row处理MYSQL_RES结果结构,从中提取一行,并把该行放到一个行结构中,当数据用完或发生错误时,返回NULL:
在这里插入图片描述
也可用mysql_data_seek函数在结果集中进行跳转,从而设置被下一个mysql_fetch_row函数返回的行:
在这里插入图片描述
参数offset的值是一个行号,它必须在0到结果集总行数-1的范围内,传递0会导致下一个mysql_fetch_row调用返回结果集中的第一行。

完成了对数据的所有操作后,必须使用mysql_free_result函数让MySQL库完成善后处理:
在这里插入图片描述
必须总是调用此函数让MySQL库清理它分配的对象。

逐行提取数据:
在这里插入图片描述
执行失败时返回NULL,如果成功,返回指向结果集对象的指针。用mysql_use_result函数返回的MYSQL_RES结构来调用msyql_fetch_row时,每次都从服务器取回行数据。

为得到所有数据,必须再反复调用mysql_fetch_row直到取得了所有数据(即直到mysql_fetch_row函数返回NULL),如果没有取完所有数据,则下次执行返回数据的sql语句时可能会返回遭到破坏的信息。

mysql_use_result调用不能与mysql_data_seek、mysql_row_seek、mysql_row_tell一起使用,并且由于直到所有数据都被提取后才能实际生效,因此mysql_num_rows的使用也受到限制。每个行请求和结果的返回都要通过网络,可能网络连接在中途失败,留下不完整的数据。但mysql_use_result函数更好地平衡了网络负载,减少了可能非常大的数据集带来的存储开销。

MySQL返回两种类型数据:元数据和表中的列数据。

mysql_field_count函数返回结果集中字段(列)的个数:
在这里插入图片描述
在旧版本的MySQL代码中,mysql_num_fields函数可以接受一个连接结构或结果结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值