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