从疯狂痴迷数据库存储过程到彻底放弃他

很早的时候,我被我们领导灌输过一个思想,我们领导当时是做WEB出身的,他非常重视WEB的功能。在他眼里,数据库只是存放数据的箱子,不应该把过多的业务逻辑交给数据库去处理,应该只把他看做是存放数据的箱子,我们当时是用MySQL + php,那时候MySQL比较弱一些,不支持存储过程、触发器,事务等等,正好符合我们领导所提倡的理念。

后来接触了ERP,发现数据量很大,全部用VB等处理效率低、速度也慢,采用存储过程效率高,而且有些Bug,新功能只要在数据库服务器上进行修改存储过程就可以了,客户端都不用修改程序,感觉这个存储过程很强大,而且通过存储过程还可以做其他软件的数据库接口,自从那以后就疯狂痴迷于存储过程、数据库技术,经常研究这些方面的技术。

又过了些日子,接触了Oracle,发现与SQLSever里的存储过程不兼容,有些写法、用法、理念差距也很大,移植问题是个很大的麻烦,虽然理论是完全可以移植的,但是要维护2套这样的系统,麻烦很多,所以开始渐渐的放弃写存储过程这个爱好了,尽量写一些简单的SQL语句的组合,尽量把商业逻辑都写在C#里,好调试些,随着对C#语法的深入理解,商业逻辑写在C#里的开发速度,比写在存储过程里还快了很多,再接着对系统整体功能的定位,渐渐放弃了局部功能的优化思想,以考虑全局为重,不差那么0.1秒的性能速度提高,不在乎这些一点点的差距。

最近几年,由于对面向服务编程的深入理解,彻底放弃写存储过程了,尽量商业逻辑都写在C#里,因为客户有可能是买了正版的Oracle或者购买了正版的SQLServer, 他们希望你的程序能跑在他们的正版数据库系统上,而不是为了使用你的系统,又重新购买另一套正版软件。

基于存储过程的数据库脚本的主要缺点是调试起来麻烦,数据库中的表字段变动了,也不提示关联错误,也没有版本控制,很容易丢失脚本程序,而且人人都有一个本地数据库,很容易把存储过程搞乱套了,最后会导致谁都不知道到底哪个才是最新的存储过程,而且给上百个存储过程起个合理的名称,这个命名工作统一规范化也是个要命的问题。

把商业逻辑写在C#里的好处就很多了,有相应的版本控制器,以前的代码也可以找出来,不怕丢失代码,有些修改程序等造成的错误,在开发环境编译阶段就能发现错误在哪里,好进行关联修正,多种版本的数据库上移植也简单些,也不用同时两边作战,又要维护数据的版本,又要维护程序的版本,发布时也会遇到2方面都需要更新的问题。还是单边作战比较简单一些,同时与其他系统的接口等,交给相应的服务程序进行处理,由服务程序来负责与其他系统的交互,这个交互又比底层数据库的交互强大很多。

我曾经写过一个小软件,里面大量采用了存储过程,给我的痛苦总结下来是,1. 数据库中的表进行了修正了,我不知道哪几个存储过程需要修正?

2. 有时候手上好几个数据库,测试来测试去,很容易不知道到底哪个是最新的,特别是过了一年半载,再去找对应的数据库时,这个问题很明显。

3. 调试C#程序很容易,调试存储过程,相对麻烦一些。

4. 参数有变动时,还要修改存储过程的参数,有时候还有关联的存储过程需要修正,很折腾人,而且运行了,才能发现这些问题。

3. 还有这个程序只能跑在SQLServer上,还好我们用的都是D版,想安装就装了,也不要钱,若真要钱,那不是开玩笑的。

现在我们开发的很多系统里,根本看不到存储过程的影子了,当然我们也不是走极端,在平时一些简单的系统里,还真没多大必要用到存储过程,能不用就不用吧,多一事不如少一事,现在总结已经走过的路,感觉还是商业逻辑尽量写在C#里是省心省力的正确道路。

时间: 2024-12-02 13:43:14

从疯狂痴迷数据库存储过程到彻底放弃他的相关文章

delphi 通过 ado 访问数据库存储过程,如果有插入动作,为什么会执行两遍?

问题描述 delphi 通过 ado 访问数据库存储过程,如果有插入动作,为什么会执行两遍? 20C 如题.这是我反复测试后得出的结论.我实在不理解为什么. 具体测试过程是这样子的:我用ado连接数据库.然后我写了一个简单的存储过程,就是往表里插入数据.然后我用ado调用这个存储过程.然后我就发现,虽然程序里我只调用了一次,但实际上表里的数据却被插入了完全一模一样的两条. 这算是bug还是怎么回事?是不是有什么我不曾注意到的细节没处理好? 存储过程代码如下: create procedure p

人民银行网站建设中数据库存储过程的调用

存储过程|数据|数据库|网站建设 一.引言 随着人民银行中心支行计算机网络建设的逐步发展和内联网二期工程的落实到位,多数中心支行已建立了内部网络(Intranet),提供文件传输.电子邮件.及简单WEB等相关网络服务. 对于人民银行中心支行而言,网站的建设需要报表.台帐等各种数字信息,报告.分析等各种文字信息,公文处理.会议通知等各种办公自动化信息,声音.图象.视频会议等各种多媒体信息.而如何充分利用现有信息资源和计算机网络技术,建设人民银行内部的信息网站,为金融监管和政策给予及时.准确.多样的

提前认识软件开发(28) 数据库存储过程中的重要表信息的保存

1. 存储过程中的重要表信息的保存 在很多存储过程中,会涉及到对表数据的更新.插入或删除等,为了防止修改之后的表数据出现问题,同时方便追踪问题,一般会为一些重要的表建立一个对应的debug表.这个debug表中的字段要包括原表的所有字段,同时要增加操作时间.操作码和操作描述等字段信息. 例如,在某项目中,包括了如下一个重要的表tb_XXX: create table tb_XXX ( AAA varchar(30) not null, -- AAA BBB varchar(30) not nul

Oracle数据库存储过程与权限

在执行存储过程时,我们可能会遇到权限问题 ● 定义者权限存储过程 ● 调用者权限存储过程 在数据库中创建存储过程时,定义者权限是缺省模式 当指定AUTHID CURRENT_USER关键字后,便是调用者权限存储过程 他俩之间最根本的差异在于role能否在存储过程中生效 ㈠ 定义者权限存储过程问题 定义者权限存储过程role无效,必须要有显式授权 即便是拥有dba role,还是不能访问不同用户的表 sys@EMREP> grant connect,resource to u1 identifie

oracle数据库存储过程 截取数据

问题描述 oracle数据库存储过程 截取数据 oracle数据库存储过程问题: 传入一个字符串(字符串格式如:"辣椒_食品,西红柿_食品,板鞋_服饰,植物油_食品,领带_食品,--") 现在我想根据","来截断字符串存储到数组(其他变量也行).然后就可以得到这样的数组string[] arr={"辣椒_食品","西红柿_食品",--} 然后循环遍历这个数组,循环每条数据的时候再根据"_"来分割数据,分割完

数据库存储过程,数据库存储过程

问题描述 数据库存储过程,数据库存储过程 在存储过程中为什么要申明变量??????????不声明可以吗?????????????????????????在什么样的情况下声明和不申明?????? 解决方案 你需要保存中间结果就需要变量,不需要中间结果保留就不需要.比如说,交换两个数,那么需要一个中间变量.两个数相加就不需要. 解决方案二: 1.存储过程是什么? ? ?? ? ? 百度百科:存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在

方法-Python 调用sqlserve数据库存储过程,有谁知道怎么用吗?

问题描述 Python 调用sqlserve数据库存储过程,有谁知道怎么用吗? 在网上找的例子比较少?有没有详细的使用方法,请大神帮帮忙,急用,谢谢! 解决方案 http://stackoverflow.com/questions/28635671/using-stored-procedurespython-ms-sql#

输入参数-db2数据库存储过程问题

问题描述 db2数据库存储过程问题 建立了一个存储过程有一个输入参数为varchar(50),但是存储过程里的得到这个参数后面多了很多空格,插入到数据库时就造成了值过大,插入失败,就算是把这个输入参数trim也是没有效果,还是有空格.存储过程在开发环境和测试环境都没有问题,放到生产环境就有问题.由于第一次使用db2数据库,实在是找不到问题所在.看看哪位大侠能帮解决一下.

oracle数据库存储过程带输入参数建表的语法和在oracle中调用语法

问题描述 oracle数据库存储过程带输入参数建表的语法和在oracle中调用语法 大神们,随便给几个例子参照一下啊,oracle数据库存储过程带输入参数建表的语法和在oracle中调用语法 解决方案 差不多这个意思,http://zhidao.baidu.com/link?url=lYFB7BBbSoybi5mTurmVbI88Q5R78nnhHyQUiMAhF3B4iyA1OiPCxY4xsRS7v_v0kBdbtCVvVlPHhfY9Rerx7K 解决方案二: create or repl