This Domain(Admin5.com) is for Sale:

My SQL数据库实用技术(34)

时间:2007-12-23  来源:不详  作者:迈克DB

■ 列名和宽度信息对漂亮地生成带有列标题并垂直排列的格式化输出是非常有用的。
■ 使用列计数来确定处理数据行的连续列值的循环所迭代的次数。假如要分配取决于结果集中已知的行数或列数的数据结构,就可以使用行或列计数。
■ 可以确定列的数据类型。可以看出列是否是数字的,是否可能包括二进制数据等等。在前面的6.6.1节“处理返回结果集的查询”中,我们编写了从结果集的行中以制表符分隔的形式打印出结果的process_result_set() 程序。这对某些目的是很好的(例如要把数据输入到电子制表软件中),但对于可视化检查或打印输出,就不是一个漂亮的显示格式。回忆前面的process_result_set() 版本,产生过这样的输出:

让我们在每列加上标题和边框来对process_result_set() 做些修改,以生成表格式的输出。这种修正版看上去更美观,输出的结果是相同的,如下所示:

显示算法的基本要点是这样的:
1) 确定每列的显示宽度。
2) 打印一列带有边框的列标题(由垂直竖线和前后的虚线分隔)。
本文来自织梦

3) 打印结果集每行的值、带边框的列(由垂直竖线分隔),并垂直排列,除此之外,打印
正确的数字,将NULL 值打印为单词“NULL”。
4) 最后,打印检索的行的计数。该练习为结果集元数据的使用提供了一个很好的示范。为了显示所描述的输出,除了行所包含的数据值之外,我们还需了解许多有关结果集的内容。您可能想,“这个描述听起来与mysql 显示的输出惊人地相似”。是的,欢迎把mysql 源代码和修正版的process_result_set() 代码比较一下,它们是不同的,可以发现对同一问题使用两种方法是有指导作用的。
首先,我们需要确定每列的显示宽度,下面列出如何做这件事情。可观察到这些计算完全基于结果集元数据,无论行值是什么,它们都没有引用:

列宽度通过结果集中列的MYSQL_FIELD 结构的迭代来计算,调用mysql _ fetch _ seek( )定位第一个结构,后续的mysql_fetch_field() 调用返回指向连续列的结构的指针。显示出来的列宽度是下面三个值中的最大值,其中每一个都取决于列信息结构中的元数据:
■ field - > name的长度,也就是列标题的长度。
■ field - > max _ length,列中最长的数据值的长度。 本文来自织梦
■ 假如列中可能包括N U L L值,则为字符串“ NULL”的长度,field->flag 表明列是否包含NULL。请注重,已知要显示的列的宽度后,我们将这个值赋给max _ length,max_length 是从客户机库获取的结构中的一个成员。这种获取是答应的吗?或者MYSQL_FIELD 结构的内容应该为只读?一般来说,是“只读的”,但是MySQL 分发包中的一些客户机程序以同样的方式改变了max_length 的值,因此,假设这也是正确的(假如更喜欢不改变max_length 值的方法,则分配一个unsigned int 值的数组,将计算的宽度存储到这个数组中)。显示宽度的计算包括一个说明,回想当使用mysql_use_result() 创建结果集时,max_length 没有意义。因为我们需要max_length 来确定列值的显示宽度,所以该算法的正确操作需要使用mysql_store_result() 产生的结果集( MYSQL _ FIELD结构的length 成员告知列值可以取得的最大值,假如使用mysql_store_result() 而不是mysql _ use _ result( )的话,这可能是个有用的工作环境)。
一旦知道了列的宽度,就可以预备打印,处理标题很轻易;对于给定的列,只需使用由field 指向的列信息结构,用已计算过的宽度打印出name 成员。

看完这篇,您有何感觉呢?

文章评论

共有位Admini5网友发表了评论 查看完整内容

24小时热门信息