是什么
百度百科“存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的sql语句集,存储在数据库中,经过一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果存储过程带有参数)来执行它。”
机房重构中,当我们需要一个方法引发多个数据库的表发生变化时,运用存储过程可以使操作更加简单。
为什么用
(来自百度百科)
1.提高数据库执行速度:存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次。
2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.可重复使用,减少数据库开发人员的工作量
4.安全性高,可设定只有某些用户才具有对指定存储过程的使用权
怎么用
1.新建存储过程
2.sql server代码
ALTER PROCEDURE [dbo].[PROC_Online]
@StudentNo char(10),
@StudentName char(10),
@Department char(10),
@Sex char(10),
@ondate char(10),
@ontime char(10),
@type char(10),
@CardNo char(10),
@Computer char(10),
@Cash char(10),
@Status char(10),
@LineStatus char(10)
AS
BEGIN
declare @error int
set @error =0
begin transaction
insert into Line_Info(CardNo,StudentNo,StudentName,Sex,Department,Type,ondate,ontime,Computer,Cash,Status) values(@CardNo ,@StudentNo,@StudentName,@Sex,@Department,@type ,@ondate,@ontime ,@Computer,@Cash,@Status )
set @error =@error +@@ERROR
update Card_Info set LineStatus ='正常上机' where CardNo=@CardNo
set @error =@error +@@ERROR
if @error <>0
rollback transaction --如果不等于0,,则回滚事务,不能执行
else
commit transaction --等于0,则执行该事务
END
3.代码引用
Public Function SaveOnline(LineInfo As Entity.MainEntity) As Boolean Implements IDAL.ILine.SaveOnline
Dim sql As String = "PROC_Online"
Dim flag As Boolean = False
Dim sqlParams As SqlParameter() = {New SqlParameter("@studentNo", LineInfo.StudentNo),
New SqlParameter("@studentName", LineInfo.StudentName),
New SqlParameter("@sex", LineInfo.Sex),
New SqlParameter("@department", LineInfo.Department),
New SqlParameter("@ondate", LineInfo.ondate),
New SqlParameter("@ontime", LineInfo.ontime),
New SqlParameter("@type", LineInfo.Type),
New SqlParameter("@CardNo", LineInfo.CardNo),
New SqlParameter("@Computer", LineInfo.Computer),
New SqlParameter("@Cash", LineInfo.Cash),
New SqlParameter("@Status", LineInfo.Status),
New SqlParameter("@LineStatus", LineInfo.LineStatus)}
flag = SqlHelper.ExecuteNoQuery(sql, CommandType.StoredProcedure, sqlParams)
Return flag
End Function
相关错误
1.列名或提供值的数目与表定义不匹配
(1)问题代码:
insert into Line_Info values(@CardNo ,@StudentNo,@StudentName,@Sex,@Department,@type ,@ondate,@ontime ,@Computer,@Cash,@Status )
(2)出现该问题的主要原因:
存储过程中定义的参数数目与表的字段数不一致
(3)解决方法:
一、插入表中的字段数目与表的总字段数一致,空值用NULL表示
二、插入值与表的字段一一对应
insert into Line_Info(CardNo,StudentNo,StudentName,Sex,Department,Type,ondate,ontime,Computer,Cash,Status) values(@CardNo ,@StudentNo,@StudentName,@Sex,@Department,@type ,@ondate,@ontime ,@Computer,@Cash,@Status )
2.变量名在查询批次或存储过程内部必须唯一
错误原因:
(1)参数重复使用
多次执行sqlcommand时,第二次执行会出现如上错误,原因是以前的参数,还存在事务中,此时只需在sqlhelper中sqlcommand执行完成后添加一句代码即可:
cmd.Parameters.Clear() '清除参数
(同一事务中多次执行带有相同参数名的SQL语句,必须在第一次执行后清理参数。)
(2)查询方式错误
错误代码:
flag = SqlHelper.ExecuteNoQuery(sql, CommandType.Text, sqlParams)
CommandType.Text:用sql语句查询
CommandType.StoredProcedure:用存储过程查询