存储过程——重构实战

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

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

    存储过程——重构实战_第1张图片


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

    

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:	
-- =============================================
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
	--查询充值表(使变量@StudentID得到StudentID的值,供第二条语句使用)
	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

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

     

Dim sqlparams As SqlParameter() = {New SqlParameter("@CardID", recharge.CardID),
                                   New SqlParameter("@Addmoney", recharge.Addmoney),
                                   New SqlParameter("@UserID", recharge.UserID),

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


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

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


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

    

        @StudentID nchar(10),
	@CardID nchar(10),
	@Addmoney varchar(10),
	@UserID nchar(10)

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


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


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

  最终D层代码

 

Dim sqlparams As SqlParameter() = {New SqlParameter("@CardID", recharge.CardID),
                                   New SqlParameter("@Addmoney", recharge.Addmoney),
                                   New SqlParameter("@UserID", recharge.UserID),
                                   New SqlParameter("@StudentID", 0)} '0是假值(任何值都可以)

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

你可能感兴趣的:(●,C/S篇)