当前位置:七道奇文章资讯数据防范MySQL防范
日期:2011-05-02 15:44:00  来源:本站整理

MySQL数据库技术(32)[MySQL防范]

赞助商链接



  本文“MySQL数据库技术(32)[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

? 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() 失利,则在打印一个错误消息今后,返回N U L L(那就是说,调用do_connect() 并获得返回值N U L L的任何程序都可以简单地退出,而不用耽忧打印消息的本身).do_ disconnect () 产生一个指向衔接处理程序的指针,并调用mysql_close ().这里是common.c 的代码:
MySQL数据库技术(32)
? ? common.h 声明common.c 中这些例程的原型:
MySQL数据库技术(32)
? ? 要想拜候大众例程,应在源文件中包含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() 的精确格局:
MySQL数据库技术(32)
MySQL数据库技术(32)
MySQL数据库技术(32)
? ? 除了下述两点以外, 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 为N U L L,也可以编写它来做一些明智的事情.也就是说,假如mysql_init() 调用失利,可以利用print _error( ).并且没有混合调用(一些为fprintf ( ),一些为print _ error( )).我听到一些反对看法:"为了想报告一个错误而又没必要每次都调用两个错误函数,所以使代码成心编写得难以阅读,以阐明封装样例更好.其实不用真的写出全部的错误打印代码:只将它编写一次,然后当再次需求时就利用拷贝和粘贴便可."这种概念是精确的,但我持反对看法,来由以下:
? ? ■ 即便利用拷贝和粘贴,用较短的代码段举行起来也更简单.
? ? ■ 每当报告错误时,无论能否乐意每次调用两种函数,将全部的错误报告代码书写得很长,会产生不一致性.将错误报告的代码放在简单调用的包装函数中,便可以削减这种设法并提高编码的一致性.
? ? ■ 假如断定改正错误消息的格局,则只需求在一个地方而不是整个程序中做更改,这样就要简单很多.大概,假如断定将错误消息编写到日记文件中而不是(或除此以外还)编写到stderr 中,则只须更改print _ error ( ),这就更简单.这种办法大概犯更少的错误,并且再一次削减了工作量和不一致的大概性.
? ? ■ 当测试程序时,假如利用调试程序,将断点放在错误报告的函数中,则当它侦测出一个错误条件时,调试程序是使程序中止的一种便利办法.以下是错误报告函数print _ error( )的利用举例:
MySQL数据库技术(32)
MySQL数据库技术(32)
? ? 主源文件client3.c 与client2.c 一样,但是全部嵌入的衔接和断开代码都操纵调用包装函数来删除和替换了.以下所示:
MySQL数据库技术(32)
MySQL数据库技术(32)

  以上是“MySQL数据库技术(32)[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • Windows 搭配 IIS7 PHP MySQL 环境
  • mysql Out of memory (Needed 16777224 bytes)的错误办理
  • mysql提醒[Warning] Invalid (old?) table or database name问题的办理办法
  • mysql启用skip-name-resolve情势时呈现Warning的处理办法
  • mysql启用skip-name-resolve情势时呈现Warning的处理办法
  • MySQL Order By语法介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • mysql数据库插入速度和读取速度的调整记录
  • MySQL Order By索引优化办法
  • MySQL Order By用法分享
  • mysql #1062 –Duplicate entry ''1'' for key ''PRIMARY''
  • MySQL Order By Rand()效率解析
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .