使用存储过程的优点和缺点
优点
1.降低网络传输数据量:通过存储过程的名称和参数传递即可调用执行,不用传输sql语句。
2.执行效率高:sqlserver会事先将存储过程编译成可执行的二进制代码,运行存储过程时,无需再次编译。
3.封装性:也可叫模块式编程,将实现某种功能的多条sql封装到一个对象中,可多次重复调用,可移植性强。
4.安全:可针对不同的权限的用户使用不同的存储过程。
缺点
1.调试麻烦,但是用 PL/SQL Developer 调试很方便!弥补这个缺点。
2.移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。
3.重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。
4.如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。
创建
USE [newcharge_sys]
GO
/****** Object: StoredProcedure [dbo].[proc_OffLine] Script Date: 2018/2/26 8:17:09 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[proc_OffLine]
@CardNo char(10),
@StuNo char(11),
@Date date,
@Type char(10),
@StuName char(10),
@Sex char(10),
@Department char(10),
@OnDate date,
@OnTime time(0),
@Computer char(10),
@Cash numeric(10, 3),
@Offdate date,
@Offtime time(0),
@ConsumeTime char(10),
@Consume numeric(18,1),
@Status char(10)
as
delete from OnLine_Info where CardNo = @CardNo
update Linelog_Info
set
Offdate = @Offdate,
Offtime = @Offtime,
ConsumeTime = @ConsumeTime,
Consume = @Consume,
Cash = @Cash,
Status = @Status
where
CardNo = @CardNo and Ondate = @OnDate and Ontime = @OnTime
update Card_Info set Cash = @Cash where CardNo = @CardNo
调用
SqlParameter[] sqlparas = {//将存储过程中的名字与程序中的名字对应起来
new SqlParameter("@CardNo",line[0].CardNo),
new SqlParameter("@StuNo",line[0].StuNo),
new SqlParameter("@Date",line[0].Date),
new SqlParameter("@Type",line[0].CardType),
new SqlParameter("@StuName",line[0].StuName),
new SqlParameter("@Sex",line[0].Sex),
new SqlParameter("@Department",line[0].Department),
new SqlParameter("@OnDate",line[0].OnDate),
new SqlParameter("@OnTime",line[0].OnTime),
new SqlParameter("@Cash",line[0].Cash),
new SqlParameter("@Computer",line[0].Computer),
new SqlParameter("@Offdate",line[0].Offdate),
new SqlParameter("@Offtime",line[0].Offtime),
new SqlParameter("@ConsumeTime",line[0].ConsumeTime),
new SqlParameter("@Consume",line[0].Consume),
new SqlParameter("@Status",line[0].Status)
};
string procname = "proc_OffLine";
sqlhelper.ExecuteNonQuery(procname, sqlparas, CommandType.StoredProcedure);