存储过程——重构实战

    关于存储过程的具体内容,我在前面的博客中已经写到过这里不再赘述,这次要说的是我再使用存储过程时遇到的一些问题,仅供大家参考。

    先交代一下背景,因为要转泛型,所有我在实体中声明了Recharge表中的所有字段作为属性。

    


    在存储过程中,我是这样写的

    

<span style="font-size:18px;"><strong>USE [chonggou]
GO
/****** Object:  StoredProcedure [dbo].[PEOC_Recharge]    Script Date: 02/14/2016 10:03:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		<郑涛>
-- Create date: <2016.02.13>
-- Description:	<recharge>
-- =============================================
ALTER PROCEDURE [dbo].[PEOC_Recharge] 
	-- Add the parameters for the stored procedure here
	--定义变量
	@StudentID nchar(10),
	@CardID nchar(10),
	@Addmoney varchar(10),
	@Rechargedate nchar(10),
	@RechargeTime nchar(10),
	@UserID nchar(10)
	@Ischeck nchar(10)
AS
BEGIN
	--查询充值表(<span style="color:#cc0000;">使变量@StudentID得到StudentID的值,供第二条语句使用</span>)
	select @StudentID=StudentID  from dbo.T_Recharge where CardID = @CardID 
	if @@ROWCOUNT = 0 
	return 2
	
	--插入充值表
	insert into dbo.T_Recharge(StudentID,CardID,Addmoney,Rechargedate ,Rechargetime ,UserID ,Ischeck )
	values(@StudentID ,@CardID,@Addmoney,CONVERT(nchar(10), GETDATE(), 120),CONVERT(nchar(10), GETDATE(), 108),@UserID ,'未结账')
	
	--更新Card表
	
	update dbo.T_Card set Cash =(select sum(Addmoney) as sum from dbo.T_Recharge where CardID = @CardID) where CardID = @CardID 
	
END
</strong></span>

    而在充值的D层我只给三个变量赋了值,理由很简单,因为其他的变量我都在存储过程中直接进行了赋值(见存储过程)

     

<span style="font-size:18px;"><strong>Dim sqlparams As SqlParameter() = {New SqlParameter("@CardID", recharge.CardID),
                                   New SqlParameter("@Addmoney", recharge.Addmoney),
                                   New SqlParameter("@UserID", recharge.UserID),</strong></span>

    此时,运行程序,报错,报错的内容大概是没有给@Rechargedatet赋值(具体报错,当时我没有记录)


    结论:存储过程中,变量的声明是有严格规范的,并不是把充值实体的所有属性都声明一遍就可以了。

                存储过程中声明的所有变量,必须在D层中赋予它一个初值,否则报错。


    得出以上结论后,我删除了存储过程中没有必要存在的变量。

    

<span style="font-size:18px;"><strong>        @StudentID nchar(10),
	@CardID nchar(10),
	@Addmoney varchar(10),
	@UserID nchar(10)
</strong></span>

    问题又来了,@StudnetID这个变量是比较特殊的,因为我不能删掉这个变量(见存储过程中第一条的注释),我利用了第一条select语句给@StudentID进行了赋值,所以说这个变量必须存在。


    可是在D层中我并不能给StudentID赋一个正确的初始值,因为不经过查询,我并不知道正确的StudentID是什么,如果在D层中不给@StudentID赋值又会报错。


    怎么办呢?纠结了一会后我发现,@StudentID的初始值是什么并不重要,因为不管这个变量的初始值是什么当,执行存储过程的第一条Select语句时都会被正确的StudentID覆盖。所以在D层中随便给@StudentID一个值就可以,但是不赋值是不可以的。

  最终D层代码

 

<span style="font-size:18px;"><strong>Dim sqlparams As SqlParameter() = {New SqlParameter("@CardID", recharge.CardID),
                                   New SqlParameter("@Addmoney", recharge.Addmoney),
                                   New SqlParameter("@UserID", recharge.UserID),
                                   New SqlParameter("@StudentID", 0)} '0是假值(任何值都可以)</strong></span>

   到这里,问题的探索就暂时结束了,一路坎坷,收获却很大。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值