My SQL数据库实用技术(34)
时间:2007-12-23 来源:不详 作者:迈克DB
■ 所有数据类型的值都是作为字符串返回的,即使是数字型的也是如此。假如需要该值为数字型,就必须自己对该字符串进行转换。
■ 在MYSQL_ROW 数组中,NULL 指针代表N U L L,除非声明列为NOT NULL,否则应该经常检查列值是否为NULL 指针。
应用程序可以利用每行的内容做任何想做的事,为了举例说明这一点,我们只打印由制表符隔开列值的行,为此还需要另外一个函数, mysql_num_fields() ,它来自于客户机库;这个函数告知我们该行包括多少个值(列)。
下面就是process_result_set() 的代码:
process_result_set() 以制表符分隔的形式打印每一行(将NULL值显示为单词“NULL”),它跟在被检索的行计数的后面, 该计数通过调用mysql_num_rows() 来计算。像mysql _ affected_rows() 一样,mysql_num_rows() 返回my_ulonglong 值,因此,将值转换为
unsigned long 型,并用‘% l u’ 格式打印。
提取行的循环紧接在一个错误检验的后面,假如要用mysql_store_result() 创建结果集,
织梦内容管理系统
mysql_fetch_row() 返回的N U L L值通常意味着“不再有行”。然而,假如用mysql _ use _ result( )创建结果集,则mysql_fetch_row() 返回的NULL 值通常意味着“不再有行”或者发生了错误。无论怎样创建结果集,这个测试只答应process_result_set() 检测错误。
process_result_set() 的这个版本是打印列值要求条件最低的方法,每种方法都有一定的缺点,例如假设执行下面的查询:
我们可以通过提供一些信息如列标签,及通过使这些值垂直排列,而使输出结果漂亮一点。为此,我们需要标签和每列所需的最宽的值。这个信息是有效的,但不是列数据值的一部分,而是结果集的元数据的一部分(有关数据的数据)。简单归纳了一下查询处理程序后,我们将在6 . 6 . 6节“使用结果集元数据”中给出较漂亮的显示格式。
打印二进制数据
对包含可能含有空字节的二进制数据的列值,使用‘ % s’printf() 格式标识符不能将它正确地打印; printf() 希望一个空终结串,并且直到第一个空字节才打印列值。对于二进制数据,最好用列的长度,以便打印完整的值,如可以用fwrite() 或putc( )。
copyright dedecms
6.6.3 通用目标查询处理程序
前面介绍的处理查询样例应用了语句是否应该返回一些数据的知识来编写的。这是可能的,因为查询固定在代码内部:使用I N S E RT 语句时,它不返回结果,使用SHOW TABLES语句时,才返回结果。
然而,不可能始终知道查询用的是哪一种语句,例如,假如执行一个从键盘键入或来源于文件的查询,则它可能是任何的语句。不可能提前知道它是否会返回行。当然不想对查询做语法分析来决定它是哪类语句,总之,并不像看上去那样简单。只看第一个单词是不够的,因为查询也可能以注释语句开始,例如:
/* comment * / SELECT
幸运的是不必过早地知道查询类型就能够正确地处理它。用MySQL C API 可编写一个能很好地处理任何类型语句的通用目标查询处理程序,无论它是否会返回结果。在编写查询处理程序的代码之前,让我们简述一下它是如何工作的:
■ 发布查询,假如失败,则结束。
■ 假如查询成功,调用mysql_store_result() 从服务器检索行,并创建结果集。
■ 假如mysql_store_result() 失败,则查询不返回结果集,或者在检索这个结果集时发生错误。可以通过把连接处理程序传递到mysql_field_count() 中,并检测其值来区别这两种情况,如下:
上一篇:My SQL数据库实用技术(33) 下一篇:My SQL数据库实用技术(35)
文章评论
共有位Admini5网友发表了评论 查看完整内容