兰色精灵 发表于 2015-1-16 22:24:28

MYSQL编程:MYSQL客户机程序3―发生毗连代码模块

DBaaS系统本身并不提供面对面访问或个人客户关系或持续不断的支持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()失利,则在打印一个毛病动静今后,前往NULL(那就是说,挪用do_connect()并猎取前往值NULL的任何程序都能够复杂地加入,而不必忧虑打印动静的自己)。do_disconnect()发生一个指向毗连处置程序的指针,并挪用mysql_close()。这里是common.c的代码:

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()的利用举例:


主源文件client3.c与client2.c一样,可是一切嵌进的毗连和断开代码都使用挪用包装函数来删除和交换了。以下所示:




尽管MySQL也有一个认证培训项目,但是它的培训却要比Oracle或MS-SQL相差很远。尽管有的使用MySQL的用户表示,MySQL很容易上手,但是对于具有企业级数据库需求的用户来说,

莫相离 发表于 2015-1-19 10:55:33

SQLServer的异构移植功能个人感觉最好了。(如果对比过SQLServer的链接服务器和Oracle的透明网关的朋友会发现SQLServer的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。)

不帅 发表于 2015-1-28 06:10:15

SP4包括用于以下SQLServer2000组件的程序包:Database组件(下载文件:SQL2000-KB884525-SP4-x86.EXE)更新SQLServer2000的32位Database组件,包括数据库引擎、复制、客户端连接组件及工具。有关其他信息,请参阅ReadmeSql2k32Sp4.htm。AnalysisServices组件(下载文件:SQL2000.AS-KB884525-SP4-x86.EXE)更新SQLServer2000的32位AnalysisServices。

老尸 发表于 2015-2-5 19:15:04

如果是将来做数据库的开发设计,就应该详细学习T-SQL的各种细节,包括T-SQL的程序设计、存储过程、触发器以及具体使用某个开发语言来访问数据库。

admin 发表于 2015-2-13 07:41:13

可以动态传入参数,省却了动态SQL的拼写。

山那边是海 发表于 2015-3-3 19:14:01

外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。

金色的骷髅 发表于 2015-3-18 20:00:09

你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非分区表。不知道这算不算一个bug。大家也可以试试。

小妖女 发表于 2015-3-26 15:04:43

理解了存储结构,再阅读下性能优化的章节基本上会对sqlserver有个清晰地认识
页: [1]
查看完整版本: MYSQL编程:MYSQL客户机程序3―发生毗连代码模块