71.蛤蟆笔记 MySQL学习——C编写MySQL程序四处理SQL
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/51059389
每条语句执行涉及以下步骤:
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_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。