【机房重构】存储过程

是什么

    百度百科“存储过程(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:用存储过程查询

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 33
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值