MYSQL网页编程之MYSQL客户机程序2―增添毛病反省
MySQL数据库归MySQLAB公司所有,但是这个软件是开源的,有一个MySQL学习教程可以免费下载。稍俱常识的新入门者都可以轻松实现在一个常见硬件上安装和配置MySQL。6.3客户机程序2―增添毛病反省
我们的第二个客户机程序将像第一个客户机程序一样,可是将修正它们,思索毛病呈现的大概性。“将毛病反省作为读者的实习”如许的项目在编程文献中相称罕见,这也许是由于反省毛病相称使人厌恶。可是,我赞成这类概念,即MySQL客户机程序应当测试毛病前提
并得当地举行回应。因为某种缘故原由,前往形态值的客户机库的挪用做这些事变,并且您要承当疏忽它们的成果。您终极仍是要试图捕捉因为没有毛病反省而呈现在程序中的毛病,这些程序的用户会对程序运转云云不纪律感应奇异。思索我们的程序,客户机程序1。怎样晓得它是不是真正毗连到服务器上?能够经由过程检察服务器的日记,找出与运转程序工夫响应的Connect和Quit事务:
这条动静暗示基本没有创立毗连。不幸的是,客户机程序1没有告知我们呈现的这些了局。实践上它不克不及。它不克不及完成任何毛病反省,以是它乃至不晓得本人产生了甚么事。不管怎样,固然纷歧定必需检察日记来寻觅是不是能毗连到服务器!让我们立即更正它。在MySQL客户机库中前往值的例程基础上以以下两种体例之一暗示乐成或失利:
■乐成时,值的指针函数前往一个非NULL指针,失利时前往NULL(在这里NULL的意义是“CNULL指针”,而不是“MySQLNULL列值”)。迄今为止,我们利用的客户机库的例程mysql_init()和mysql_real_connect()都用前往毗连处置程序的指针来暗示乐成,NULL暗示失利。
■整型数值的函数一样平常乐成前往0,失利前往非0。不要测试特定的非0值,如-1。由于当失利时,其实不包管客户机库函数前往任何特定的值。偶然,您大概会看到像以下的较旧的毛病地测试前往值的代码:
这个测试大概事情,也大概不事情。MySQLAPI不将任何非0毛病的前往指定为特定的值,而只判别它(明显地)是不是为0。这个测试应当写成上面两段之一:
或以下所示:
这两个测试是等价的。假如考核MySQL的源代码,则能够发明,它基础上用第一种情势测试,由于这编写起来更冗长。
不是每一个API挪用都前往值。我们利用的另外一个客户机例程mysql_close()就不前往值(它怎样失利?失利了又怎样?不管怎样,都要举行毗连)。
当客户机库挪用失利,而且必要有关失利的具体信息时,API中的两个挪用都是有效的。mysql_error()前往包含毛病信息的字符串,而mysql_errno()前往数值代码。应当在毛病呈现今后立即挪用它们,由于假如公布另外一个前往形态的API挪用,则从mysql_error()或mysql_errno()猎取的任何毛病信息都未来自于前面的挪用。
一样平常来讲,程序的用户检察毛病字符串比检察毛病代码更有启示。假如只呈报二者中的一个,则倡议呈报字符串。出于周全思索,本章的这个样例呈报两个值。思索前述的会商,我们将编写第二个客户机程序,即客户机程序2。它相似于客户机程序
1,可是得当地增添了毛病反省代码。源文件client2.c以下所示:
这个毛病反省的逻辑是,假如失利,则mysql_init()和mysql_real_connect()都前往NULL。请注重,只管这个程序反省mysql_init()前往的值,可是,假如它失利,却不挪用毛病呈报函数。这是由于当mysql_init()失利时,不克不及假定毗连处置程序包含任何成心义的信息。
相反,假如mysql_real_connect()失利了,则毗连处置程序其实不反应无效的毗连,可是切实其实包含传送给毛病呈报函数的毛病信息(不要将该处置程序传送给任何其他的客户机例程!由于它们一样平常假定是一个无效毗连,以是您的程序大概溃散)。编译和毗连客户机程序2,然后试着运转它:
%client2
假如客户机程序2没有别输入,则毗连乐成。另外一方面,大概会以下所示:
这个输入暗示没有创立毗连,并申明为何。大概,它还暗示我们的第一个程序,即客户机程序1,没有乐成地毗连到服务器(究竟客户机程序1利用一样的毗连参数)!而在当时我们不晓得,由于客户机程序1没有毛病反省。而客户机程序2做反省,以是当出成绩时,它能够告诉我们。这就是应当一直测试API函数前往值的缘故原由。
MySQL邮件清单成绩常常是与毛病反省有关的。典范的成绩是“当发送这个查询时,为何我的程序溃散了?”或“我的程序怎样没有前往任何器材?”在很多情形下,在查询公布之前,有疑问的程序不反省在公布该查询前是不是乐成地创建了毗连,大概不反省在试着检
索了局前确保服务器乐成实行该查询。不要假定每一个客户机库都挪用乐成。
本章上面的例子完成毛病反省,并且也应当如许。看起来它仿佛有更多的事情,可是从久远地运转来看,它的事情实践上是少的,由于您化费了更少的工夫来捕捉扑朔迷离的成绩。在第7章“PerlDBIAPI”和第8章“PHPAPI”中,也利用这类反省毛病的办法。
如今,当运转客户机2的程序时,假定看到回绝会见(Accessdenied)的动静。怎样更正这个成绩呢?一种多是将主机称号、用户称号和口令的#define行变动为同意会见服务器的值。这是有优点的,在这个意义上,最少应当能做一个毗连。可是,这些值是程序中的流动编码。以是笔者倡议不要用这类办法,出格是对口令值。当将本人的程序编译为二进制格局时,您大概以为口令埋没起来了,可是,假如有人在程序上运转strings,则它基本埋没不住(更不必申明读取会见源文件的人基本不必做一点事情,就能够猎取口令)。
在“客户机程序4―运转时猎取毗连参数”一节中我们将处置会见的成绩。起首,笔者
想申明编写毗连代码的一些其他办法。
MySQL采用双重授权(DualLicensed),它们是GPL和MySQLAB制定的商业许可协议。 可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。 也可谈一下你是怎么优化存储过程的? 在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。 对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。 语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的! 如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。 我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力 SQL语言是学习所有数据库产品的基础,无论你是做数据库管理还是做数据库开发都是这样。不过具体学习的侧重点要看你将来做哪一块,如果是做数据库管理(DBA),侧重点应该放在SQLServer的系统管理上.
页:
[1]