葵花宝典之BDE玩转复杂T-SQL

    版权声明:以下文字乃本人多年潜心研究之成果,所有荣誉归俺所有,所有后果由你承担,特此声明!

    地球人都知道,俺们这旮旯是玩Delphi+SQLServer的,论起数据库引擎,ADO不可谓不好,毕竟是富人比你·该死家的东西,虽说不是清晨的第一滴露水,但也多少汇聚了一点日月光华,尤其是它对自家COM+事务的支持,不是像宝兰这样穷人家的孩子所能望其项背d。可冥冥之中自有天意,偏偏俺们上了宝兰这条破——船,这日子是一年不如一年。看看用ADO从SQLServer那整来的上万条数据,要转送到宝兰这条船上,那个慢的啊,竟然比咱们公司的网速还慢上N倍,怎能不叫人咬牙切齿,怒发冲得比岳飞还高呢!
    古语有云,天涯何处无芳草,何必单恋一只花。又云,车到山前必有路,船到桥头自然直。真把人逼到绝路上,谁他妈都有几分急智。玩不起奥迪,咱还跑不起夏利?听说宝兰家也个数据库引擎,名曰BDE,虽不是生于官宦之家,倒也有几分姿色,当年也曾风骚几个县镇。今日一见,果然不同凡响,整个几万条数据眨眼工夫,完全不费吹灰之力。据不完全统计,大概比ADO在同等条件下要快9倍之多!佛曰:放下屠刀,立地成佛。咱虽跟随M$多年,但向善之心不死,而今幸结善缘,岂有不躬身相从之理?两厢情愿之下,感情发展也非常之迅速,——无奈M$势大,一时不能与之分庭抗礼,故也不能彻底抛弃ADO,只能遮遮掩掩,便宜行事了!
    此乃在下与BDE结识之前因,天气凉外面冷,各位看官如有感同身受者就请多点耐心,小孩不要乱跑,老人站久的就先请就地坐一下,容在下把这惊天地泣鬼神的现代三角黄昏同性师生恋——讲完!
    本以为有了BDE就不愁还要出去喝花酒了,无奈M$勾结官府,欺行霸市,凭借Windows平台的优势把T-SQL强加到俺们身上。不过,用惯了倒也没觉得有啥不好,尤其是ADO当家的时候,有什么复杂业务,怪异需求,也都能做到得心应手。而今,换了BDE当家,没有M$这个有钱的丈人撑腰,方觉柴米油盐样样都贵。平时花生小酒(普遍的查询)虽没有问题,来个客人要上个鸡汤牛排(变量游标)什么的,就显寒碜了。所以说了,小家碧玉万般好,论起过日子,还是大家闺秀来得舒坦啊!你看,SQL里带游标不支持,给变量赋值也不支持,……
    我不禁要问,如果爱上了BDE,是不是就意味着与复杂SQL无缘?我问这个问题的时候,不巧被一个香港导演听到了,后来他就拍成了一部电影,叫做《如果·爱》,最近好像刚上映。各位有钱的大佬可以去电影院看看,如果跟我一样没钱,就到网上找个BT拖一下,效果不好也就凑合凑合看吧!
    为了不使这段感情就此破裂,本着负责任的态度,我毅然决定闭关修炼,潜心寻找化解感情危机的门路。这一闭关,又经多少世事变幻,人情冷暖……(此处省略一千字)。所幸,苍天不负有心人,终于被我找到解决BDE不支持T-SQL诸多特性的方法。现在向各位看官揭晓,铛铛铛铛铛铛铛,那就是——充分存储过程和函数,把表面不支持的特性封装到存储过程里!举例说明:
    BDE不支持在SQL里直接创建游标,那么我们就写一个存储过程或者函数,在其中实现本来游标要做的事情,用存储过程结合OUTPUT参数同样可以解决给SQL变量赋值的问题(所幸,BDE是支持Use语句和Declare语句的),例:

    declare @i int
    
select @i = 100
    
select @i as id


    BDE本来不支持这样的SQL语句,报错说“error create cursor handle”,我跟了半天无奈宝兰小气没提供bde.pas的源码,无法解决。所以,我叫写一个存储过程叫usp_assigninteger来实现赋值功能,具体如下:

    CREATE PROCEDURE [dbo].[usp_assigninteger] @input int@output int output AS
    
select @output = @input
    
GO


    然后把上面的SQL改成:

    declare @i int
    
exec usp_assigninteger(100@i output)
    
select @i as id


    放到TQuery里执行,通过!欣喜之余,我想到了天下还有无数的有情人不能终成眷属,心里不免升起几分黯然,我和BDE的感情虽然依旧,但那么多纯真善良的感情还在遭受M$的欺凌。各位看官,请您和我一起祈祷——愿世界没有疾病、贫穷,以及战火!上帝与佛同在!阿弥陀——门。

posted on 2005-12-13 12:35  zhousl  阅读(487)  评论(1)    收藏  举报

导航