您的位置:首页 > 数据库 > MySQL

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来查明。

处理返回结果集

除了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。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: