关于存储过程的具体内容,我在前面的博客中已经写到过这里不再赘述,这次要说的是我再使用存储过程时遇到的一些问题,仅供大家参考。
先交代一下背景,因为要转泛型,所有我在实体中声明了Recharge表中的所有字段作为属性。
在存储过程中,我是这样写的
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是假值(任何值都可以)
到这里,问题的探索就暂时结束了,一路坎坷,收获却很大。