Mysql入门系列:MYSQL客户机程序3—产生连接代码模块

2016-02-19 15:24 3 1 收藏

今天图老师小编给大家介绍下Mysql入门系列:MYSQL客户机程序3—产生连接代码模块,平时喜欢Mysql入门系列:MYSQL客户机程序3—产生连接代码模块的朋友赶紧收藏起来吧!记得点赞哦~

【 tulaoshi.com - 编程语言 】

   6.4 客户机程序3产生连接代码模块

  对于我们的第三个客户机程序,即客户机程序3,通过将它封装到函数do_connect() 和do_disconnect() 中,将使连接和断开代码更加模块化,这样可以很容易地由多个客户机程序使用。这提供一种选择,可将连接代码精确地嵌入到main() 函数中。无论如何,对在应用程序过程中套用老调的任何代码都是一个好主意。将它放在可以通过多个程序访问的函数中,而不是在每个程序中都编写一遍。如果修正这个函数中的一个错误或对这个函数作了一些改进,则可只更改一次,只要重新编译就可以使用这个函数的所有程序都被修正或利用这种改进。同样,编写一些客户机程序,以便在它们执行过程中可以若干次地连接和断开。如果将安装和卸载方法放在连接和断开的函数中,则编写这样一个客户机更加容易。封装策略如下所示:

  1) 将公用代码分离到一个独立的源文件( common.c)的包装函数中。

  2) 提供一个头文件,common.h,其中包括该公共例程的原型。

  3) 在使用公共例程的客户机源文件中包括common.h。

  4) 将公共源文件编译成目标文件。

  5) 将公共目标文件连接到您的客户机程序中。

  用这些策略,让我们构造do_connect() 和do _ disconnect( )。

  do_connect() 代替对mysql_init() 和mysql_real_connect() 的调用,并替换错误打印的代码。除了不传递任何连接处理程序外,您可以像mysql_real_connect() 一样调用它。do_connect() 分配并初始化这个处理程序,然后,在连接后返回一个指向它的指针。如果do_ connect() 失败,则在打印一个错误消息以后,返回NULL(那就是说,调用do_connect() 并获取返回值NULL的任何程序都可以简单地退出,而不用担心打印消息的本身)。do_ disconnect () 产生一个指向连接处理程序的指针,并调用mysql_close ()。这里是common.c 的代码:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  

  common.h 声明common.c 中这些例程的原型:

  

  要想访问公共例程,应在源文件中包括common.h。请注意, common.c 同样包括common.h。那就是说,如果common.c 中的函数定义与头文件中的声明不匹配,则立即得到一个编译程序警告。同样,如果更改common.c 中的调用次序而没有相应地更改common.h,则当重新编译common.c 时,编译程序将发出警告。

  有人会问为什么要发明包装函数do _ disconnect( ),而它使用得还这么少。do _ disconnect( )和mysql_close() 等价。但是假设在断开连接时,都有一些要执行的额外清除。则通过调用已经完全控制的包装函数,可以修改该包装函数来做需要的事情,对于所做的任何断开的操作,这种更改统一生效。如果直接调用mysql_ close( ),则不能做到这点。在前面,笔者声称对在多个程序中或在单个程序内部多处使用的函数中,将代码封装成模块化代码是有好处的。前面介绍一个理由,还有一些理由参见下面的两个样例。

  ■ 样例1在MySQL3 .22以前的版本中,mysql_real_connect() 调用与它现在稍微有些不同:即没有数据库名称参数。如果想利用旧的MySQL客户机库使用do _ connect( ),则它不能工作。然而,可以修改do _ connect( ),使它可在3.22版以前的版本上运行。这就

  意味着,通过修改do _ connect( ),可以增加使用它的所有程序的可移植性。如果将这些连接代码直接嵌入到每个客户机中,则必须独立地修改它们中的每一个。

  要想修正do _ connect( ),使它可以处理mysql_real_connect() 的旧格式,那么就可以使用包括当前MySQL版本MySQL_VERSION_ID 宏。更改了的do_connect() 测试MySQL_VERSION_ID 值,并使用mysql_real_connect() 的正确格式:

  

  

  

  除了下述两点以外, do_connect() 的这个修改过的版本和前一个版本在外观上是完全一样的:

  ■ 它不将db_name 参数传递给mysql_real_connect() 较早的格式,因为那个版本没有这样的参数。

  ■ 如果数据库名称是非NULL 的,则do_connect() 调用mysql_select_db() 使指定的数据库为当前数据库(这类似于没有db_name 参数的效果)。如果没有选择这个数据库,则do_connect() 打印一个错误消息,关闭连接,并返回NULL 来表示失败。

  ■ 样例2 该样例是在对第一个样例的do_connect() 做更改的基础上建立的。那些更改导致对错误函数mysql_errno() 和mysql_error() 的三组调用。每次都将报告问题的这些代码书写出来是非常讨厌的。除此之外,错误所打印出的代码看起来不舒服,读起

  来也困难。而读下面这样的代码就比较容易:

  print_error (conn, mysql_real_connect() failed) ;所以,让我们在print_error() 函数中封装错误打印。即使conn 为NULL,也可以编写它来做一些明智的事情。也就是说,如果mysql_init() 调用失败,可以使用print _error( )。而且没有混合调用(一些为fprintf ( ),一些为print _ error( ))。我听到一些反对意见:为了想报告一个错误而又不必每次都调用两个错误函数,所以使代码故意编写得难以阅读,以说明封装样例更好。其实不用真的写出所有的错误打印代码:只将它编写一次,然后当再次需要时就使用拷贝和粘贴即可。这种观点是正确的,但我持反对意见,理由如下:

  ■ 即使使用拷贝和粘贴,用较短的代码段进行起来也更容易。

  ■ 每当报告错误时,无论是否愿意每次调用两种函数,将所有的错误报告代码书写得很长,会产生不一致性。将错误报告的代码放在容易调用的包装函数中,就可以减少这种想法并提高编码的一致性。

  ■ 如果决定修改错误消息的格式,则只需要在一个地方而不是整个程序中做更改,这样就要容易许多。或者,如果决定将错误消息编写到日志文件中而不是(或除此以外还)编写到stderr 中,则只须更改print _ error ( ),这就更容易。这种方法可能犯更少的错误,而且再一次减少了工作量和不一致的可能性。

  ■ 当测试程序时,如果使用调试程序,将断点放在错误报告的函数中,则当它侦测出一个错误条件时,调试程序是使程序中断的一种便利方法。以下是错误报告函数print _ error( )的使用举例:

  

  

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  主源文件client3.c 与client2.c 一样,但是所有嵌入的连接和断开代码都利用调用包装函数来删除和替换了。如下所示:

  

  

  查看全套"Mysql入门系列教程"

来源:http://www.tulaoshi.com/n/20160219/1609567.html

延伸阅读
在本书的这部分中,我们将讨论编写自己的访问MySQL数据库的程序所需要知道的内容。MySQL有一组实用程序。例如, mysqldump 导出表的上下文和结构定义, mysqlimport将数据文件加载到表中, mysqladmin 实现管理w操作, mysql可以使用户与服务器交互来执行任意的查询。每个标准的MySQL实用程序都倾向于小巧,重点放在程序可完成特定的、有...
4.6 管理员的优化 前面各段介绍了普通的MySQL用户利用表创建和索引操作,以及利用查询的编写能够进行的优化。不过,还有一些只能由MySQL管理员和系统管理员来完成的优化,这些管理员在MySQL服务器或运行MySQL的机器上具有控制权。有的服务器参数直接适用于查询处理,可将它们打开。而有的硬件配置问题直接影响查询处理速度,应该对它...
3.6 检索记录 除非最终检索它们并利用它们来做点事情,否则将记录放入数据库没什么好处。这就是SELECT 语句的用途,即帮助取出数据。SELECT 大概是SQL 语言中最常用的语句,而且怎样使用它也最为讲究;用它来选择记录可能相当复杂,可能会涉及许多表中列之间的比较。SELECT 语句的语法如下: 除了词 S E L E C T和说明希...
关系数据库的世界是一个表与集合、表与集合上的运算占统治地位的世界。数据库是一个表的集合,而表又是行和列的集合。在发布一条SELECT 查询从表中进行检索行时,得到另一个行和列的集合。这些都是一些抽象的概念,对于数据库系统用来操纵表中数据的基本 表示没有多少参考价值。另一个抽象概念是,表上的运算都同时进行;查询是一种概...
MySQL管理员应该知道怎样通过指定哪些用户可连接到服务器、从哪里进行连接,以及在连接时做什么,来设置MySQL用户账号。MySQL3.22.11引入了两个更容易进行这项工作的语句:GRANT 语句创建MySQL用户并指定其权限,REVOKE 语句删除权限。这两个语 句充当mysql数据库中的授权表的前端,并提供直接操纵这些表内容的可选择的方法。GRANT 和...

经验教程

156

收藏

22
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部