71.笔记 MySQL学习——C编写MySQL程序四处理SQL
2017-11-21 20:00
615 查看
71.笔记 MySQL学习——C编写MySQL程序四处理SQL
每条语句执行涉及以下步骤:
l 构造语句
l 把语句发送给服务器执行
l 对结果进行处理
MYSQL客户端开发包包含两组用于语句执行的例程。把语句当做字符串发送或使用二进制协议发送。
发送的函数是mysql_real_query或mysql_query. 其中mysql_query必须是一个以null结尾的字符串。
如果成功返回零值,失败返回非零值。
处理修改行的语句,可以调用mysql_affected_rows来查明。
调用mysql_store_result或mysql_use_result可以生成结果集,调用成功返回mysql_res指针。
调用mysql_fetch_row函数,依次取回结果集里的每一行(MYSQL_ROW是一个数组指针)。
处理完结果集后,调用mysql_free_result来释放所使用的内存资源。
可以利用MYSQL的C语言API编写通用的语句处理器。
执行语句,失败则结束
l 执行成功,调用mysql_store_result获取结果集
l 调用mysql_fetch_row函数来处理各个行,直到返回NULL
l 如果调用mysql_store_result失败,则调用mysql_field_count来区分是没有返回结果集还是创建结果集时失败。(结果集太大导致内存分配失败,或者网络接在在获取行时意外中断)
l 调用mysql_use_result
l 调用mysql_error或mysql_errno,而非mysql_field_count来确定结果集检索失败
Mysql_store_result会取回行,并分配内存,然后缓存起来,此后的mysql_fetch_row调用不会返回出错消息。
Mysql_store_result需要把完整的结果保存在客户端,如果是大型结果集,内存有 耗尽的风险。
Mysql_use_result对内存要求很低,但是加重了服务器的复制,服务器必须保存结果集里的行,一直到客户端程序认为适合检索所有这些行的那一刻为止。
Mysql_use_result不适合在以下两类客户端程序:
n 根据用户请求,逐个遍历各有关行的交互式客户端程序
n 在两次行检索操作之间,需要执行大量处理操作的客户端程序
Mysql_store_result会消耗较多的内存,可以立刻访问整个结果集,函数mysql_data_seek,mysql_row_seek,mysql_row_tell可以按任意访问各个行,如果想要任意顺序,必须使用mysql_store_result.
Mysql_store_result可以访问某些使用mysql_use_result时访问不到的列信息。
因为mysql_use_result比mysql_store_result要少,所以客户端必须通过mysql_fetch_row调用取回结果集里的每个行。
Mysql_use_result每次只能使用一个结果集。
默认情况下mysql和mysqldump使用mysql_store_result,当在命令行上给出—quick选项时,则会使用mysql_use_result.
l 行数和列数,mysql_num_rows和mysql_num_fields
l 当前行里各列值的长度。Mysql_fetch_lengths
l 关于各列的信息,都保存在MYSQL_FIELD结构里,调用mysql_fetch_field。
元数据是否可用,取决于所用的结果集处理方法。必须使用mysql_store_result。
每条语句执行涉及以下步骤:
l 构造语句
l 把语句发送给服务器执行
l 对结果进行处理
MYSQL客户端开发包包含两组用于语句执行的例程。把语句当做字符串发送或使用二进制协议发送。
发送的函数是mysql_real_query或mysql_query. 其中mysql_query必须是一个以null结尾的字符串。
如果成功返回零值,失败返回非零值。
处理修改行的语句,可以调用mysql_affected_rows来查明。
处理返回结果集
除了select,像show,describe,explain,check table语句都会返回结果集。调用mysql_store_result或mysql_use_result可以生成结果集,调用成功返回mysql_res指针。
调用mysql_fetch_row函数,依次取回结果集里的每一行(MYSQL_ROW是一个数组指针)。
处理完结果集后,调用mysql_free_result来释放所使用的内存资源。
通用语句处理器
很多时候开发者并不知道给定语句所表示的是何种语句,是从键盘输入还是从文件读入的。可以利用MYSQL的C语言API编写通用的语句处理器。
执行语句,失败则结束
l 执行成功,调用mysql_store_result获取结果集
l 调用mysql_fetch_row函数来处理各个行,直到返回NULL
l 如果调用mysql_store_result失败,则调用mysql_field_count来区分是没有返回结果集还是创建结果集时失败。(结果集太大导致内存分配失败,或者网络接在在获取行时意外中断)
另一种处理方法
l 执行语句,用一个计数字符串和mysql_real_query来代替以null结尾的字符串和mysql_query()l 调用mysql_use_result
l 调用mysql_error或mysql_errno,而非mysql_field_count来确定结果集检索失败
mysql_store_result与mysql_use_result对比
mysql_use_result不会检索任何行,只是逐行完成对检索的初始化工作,必须自己针对每一行调用myusql_fetch_row来完成检索操作。Mysql_store_result会取回行,并分配内存,然后缓存起来,此后的mysql_fetch_row调用不会返回出错消息。
Mysql_store_result需要把完整的结果保存在客户端,如果是大型结果集,内存有 耗尽的风险。
Mysql_use_result对内存要求很低,但是加重了服务器的复制,服务器必须保存结果集里的行,一直到客户端程序认为适合检索所有这些行的那一刻为止。
Mysql_use_result不适合在以下两类客户端程序:
n 根据用户请求,逐个遍历各有关行的交互式客户端程序
n 在两次行检索操作之间,需要执行大量处理操作的客户端程序
Mysql_store_result会消耗较多的内存,可以立刻访问整个结果集,函数mysql_data_seek,mysql_row_seek,mysql_row_tell可以按任意访问各个行,如果想要任意顺序,必须使用mysql_store_result.
Mysql_store_result可以访问某些使用mysql_use_result时访问不到的列信息。
因为mysql_use_result比mysql_store_result要少,所以客户端必须通过mysql_fetch_row调用取回结果集里的每个行。
Mysql_use_result每次只能使用一个结果集。
默认情况下mysql和mysqldump使用mysql_store_result,当在命令行上给出—quick选项时,则会使用mysql_use_result.
结果集元数据
结果集不仅包含从数据行里检索出来的列值,还包含于这些数据有关的信息,叫做结果集的元数据。l 行数和列数,mysql_num_rows和mysql_num_fields
l 当前行里各列值的长度。Mysql_fetch_lengths
l 关于各列的信息,都保存在MYSQL_FIELD结构里,调用mysql_fetch_field。
元数据是否可用,取决于所用的结果集处理方法。必须使用mysql_store_result。
相关文章推荐
- 75.笔记 MySQL学习——C编写MySQL程序八一次执行多条SQL
- 70.笔记 MySQL学习——C编写MySQL程序三出错处理和命令选项处理
- 69.笔记 MySQL学习——C编写MySQL程序二连接服务器
- ASP.NET 3.5核心编程学习笔记(43):HTTP处理程序的编写之图片查看器
- 73.笔记 MySQL学习——C编写MySQL程序六交互式语句执行
- 76.笔记 MySQL学习——C编写MySQL程序九预处理
- JDBC基础学习笔记_02JDBC编程的mysql数据准备并编写程序
- 74.笔记 MySQL学习——C编写MySQL程序七支持SSL
- 68.笔记 MySQL学习——C编写MySQL程序一准备
- ASP.NET 3.5核心编程学习笔记(44):HTTP处理程序的编写之从数据库加载图像
- ASP.NET 3.5核心编程学习笔记(42):HTTP处理程序的编写之建立数据报表
- Jim's游戏外挂学习笔记2—适时编写个读取状态的小程序增加一下士气
- 【学习笔记】SQL语句处理分组合并
- 【Rebol 学习笔记】第一篇:编写一个简单的 CGI 程序
- Web Server程序编写学习笔记(二)
- Web Server程序编写学习笔记(一)
- ASP.NET 3.5核心编程学习笔记(41):HTTP处理程序与HTTP模块
- Windows内核学习笔记(四)-- 编写程序手动加载驱动程序
- 编写指定日期导出mysqlbinlog为.sql文件的程序
- 学习笔记---工作和面试中的Sql题目和处理方法