Delphi 数据库感受

接触Delphi的时间实在不长,在一个多月前,我对它还是一无所知,形同末路,因为工作的需要我才开始去学习。然而任务紧迫,这也应验了一句老话:有压力才有动力。在无比巨大的压力下,学习并掌握它的动力也相应的以级数的速度增长。 我从尝试BDE开始,TTable、TQuery,折腾了一个星期才意识到BDE的局限性。接着又转向ADO,又是一遍ADOConnection、ADOTable、ADOQuery。后来放弃了ADOTable和ADOQuery,研究了半天存储过程,便开始铺天盖地地使用ADOStoredproc。ADOStoredproc真是个好东西!甭管返不返回数据集,甭管处理一个表还是多个表,都交给SQL语句去搞定吧,然后就只需要运行它、再运行它……接着就是COM、DLL,每一天都有新发现,每一天都经历着迷惑、烦乱、惊喜、顿悟和再迷惑、烦乱、惊喜、顿悟的循环,似乎没有止境,唯一不同的仅仅是循环的周期而已。现在看discovery,听到那句:"今天你又有什么新发现?"正是思绪万千啊。闲话扯了这么多,我只想强调,如果这个任务能按时顺利完成,那一定要归功于集体的智慧! 言归正传,有经验的程序员都有这样的体会,不管用哪种语言编写代码,我们都会发现一些奇点:某个地方调试了再调试,比对了再比对,明明和那个例子一模一样,为什么就是不成功呢?也许你琢磨了两三天,也许是一个星期都没有进展。嘿嘿,就是那么一点小技巧你不知道,就是那一个小地方你没注意,一连几天的工夫可能都白费了。这正是我要谈的主要内容。首先声明,以下内容都是大家不断摸索,锲而不舍的心血结晶,也许对Delphi老手来说不值一提,但如果你和我们一样打算从零开始,或许对你会有帮助。 之一:使用Query 用过Query控件的人可能都对其能自由运用SQL语句进行多表查询、修改甚至插入、删除津津乐道。使用这类控件的流程一般是先创建--close--指定数据源--再写入SQL语句--最后运行SQL语句。这里有一个小地方容易被人忽略,针对是否返回结果集,在执行SQL语句时应选用不同的方式。如果结果需要返回结果集,比如查询时,用open执行;否则用ExecSQL执行,比如插入、修改时。 之二:BDE和ADO 数据库方面的应用历来是Delphi的优势,它通过IDE(integrated development environment)建立数据库应用,为用户提供接口--数据库引擎,使应用程序可以不直接访问物理数据库,大大提高了设计速度。BDE(Borland Database Engine)是其中一种接口,使用BDE Administrator我们可以方便的配置数据源,创建和删除ODBC驱动,创建和维护数据库别名。但是BDE只适用于Borland系列产品,享受这种方便的代价是必须放弃部分灵活性,影响最大的就是不能在运行阶段动态地指定数据源。还好Delphi提供了ADO可供选择。ADO(ActiveX Data Objects)提供了一个一致的、高性能的、高兼容性的数据访问接口。使用ADO控件能灵活的连接数据源,既可以在设计阶段指定,也可以在运行时动态修改,另外一个重要的优势是ADO被内置在微软的操作系统里,所以使用ADO访问数据库不需要在每一台PC中再安装ADO了。 之三:获取存储过程的参数 把对数据库的操作放在服务器端,使用存储过程来执行的好处是显而易见的,一则因为数据库服务器对存储过程进行优化编译,提高了执行效率;二则数据在服务器上处理,限制了向客户传递不必要的数据。在存储过程中可以使用输入参数和返回参数,如果在设计阶段绑定存储过程,可以看到参数列表中除了自定义的参数外还会有一个@RETURN_VALUE,这个参数反映了存储过程运行状态,在SQL Server中,如果存储过程运行成功就返回0,否则返回非0。但如果需要在运行阶段指定存储过程,我发现此时参数列表是空的,虽然可以通过AddParameter方法添加参数,但却不能得到@RETURN_VALUE。这个问题曾经困扰了我好长时间,没有@RETURN_VALUE在判断的时候总要绕个大圈子,很不方便。后来刘彬斌偶然发现Parameters有一个方法:Refresh可以重置参数列表,这样就能动态获取参数不用再手工添加了,@RETURN_VALUE的问题也解决了。 之四:无心之失 在调用存储过程、SQL查询是一定要小心核对字段名,在你百思不得其解为什么找不到字段时,很有可能就是字段名写错了。别小看这种似乎是很弱质的问题,这种小地方往往是最不起眼的,也最难发现错误。我们血的教训是帐户与账户,坐标与座标,date与data,下次你可要小心啰! 之五:Dll中使用参数 在创建动态链接库时,我们会在Library单元中看到一大段注释,不要小看了注释,这里的注释就暗藏了玄机。它的大意如下:有关Dll内存管理的重要提示(这里可是用了'Important note'):如果你在过程或函数中引入了strings作为参数或返回值,在Library单元和工程的uses子句中必须先引用(the first unit)ShareMem单元,并且这个约定对于在Record或类中使用到的strings同样适用。ShareMem是BORLNDMM.DLL共享内存管理的接口单元,它会随着Dll展开,如果要避免使用BORLNDMM.DLL,可以使用PChar 或 ShortString代替strings。在实际使用过程中,我们也发现传入动态链接库中的参数值经常会不正确,除了遵循上述约定外,我们建议非显式调用动态链接库的函数时采取一下流程:在动态链接库工程中创建一个接口单元用来声明函数,在应用工程中引入该单元,然后在需要用到动态链接库函数的地方uses一下就OK了。 看来要用好Delphi也不是一件简单的事,我们能力有限,以上雕虫小技全是经验之谈,仅供参考,如有不实之处,还望Delphi高手多多赐教。在这条探索Delphi的路上,我们会继续总结出一些实用经验,与大家分享。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值