重构——存储过程返回值探索

来源:互联网 发布:base64解码算法 编辑:程序博客网 时间:2024/05/16 06:39

    前面的博客提到了,重构到退卡窗体的时候本来用的触发器,后来经过简单的分析觉得有点不太合适,于是最后决定用存储过程,可是用存储过程也不是那么一帆风顺的,到底发生了什么呢?

     首先,说一下我的思路,首先在U层输入卡号,将卡号传到D层,之后在数据库中写一个存储过程,存储过程中有三条SQL语句,如下图:

     

<span style="font-size:18px;"><strong>        --查询Card表        select * from dbo.T_Card where CardID = @CardID --更新Card表update dbo.T_Cardset Isuse = 'off' where CardID = @CardID --插入CancelCard表(可赋值查询)insert into dbo.T_Cancelcard (CardID ,StudentID ,Cancelcash ,Canceldate ,Canceltime ,UserID ,Ischeck )values (@CardID ,@StudentID ,@CancelCash ,@Canceldate ,@Canceltime ,@UserID ,@Ischeck )</strong></span>
      这是存储过程中的部分代码,我的想法是,首先查询输入的卡号,将查到的关于本卡的信息返回到D层,最后返回到U层显示出来,之后更新card表中的字段,将本卡的状态改为不可用,最后将这条记录插入到CancelCard表中。


      两个问题

              一、在存储过程中执行的Select语句可以返回查询到的内容呢?如果可以如何返回?

              二、在存储过程中如何将查询到的Card表中的信息插入到CancelCard表中去?


     于是,我就一直在探索这两个问题,咱们一起来看。

   

    第一个问题:

       SQL server存储过程可以后返回值,也可以没有返回值。


        没有返回值的情况:存储过程中没有return之类的语句。

         count = ExecuteNonQuery(存储过程),显示栏中有影响的行数,受影响的行数就是count的值

         count=ExecuteNonQuery(存储过程),显示栏中显示“命令已成功完成” count= -1

         并且,不管ExecuteNonQuery()是按照commandType.StoredProcedure或CommandType.Text结论都是一样的。


        有返回值的情况,只要查询输出参数,查询结果为输出参数最后变成的值,如return 0 ,return 1 等,如果不查询输出参数,返回值为0


    第二个问题:

             在存储过程中,如果第二条SQL语句要使用第一条SQL语句的查询结果的话,不用定义参数,直接定义变量进行赋值查询即可,如下图:

             

<span style="font-size:18px;"><strong>   --查询Card表        select @StudentID = StudentID  ,@CancelCash = Cash  from dbo.T_Card where CardID = @CardID --更新Card表update dbo.T_Cardset Isuse = 'off' where CardID = @CardID --插入CancelCard表(可赋值查询)insert into dbo.T_Cancelcard (CardID ,StudentID ,Cancelcash ,Canceldate ,Canceltime ,UserID ,Ischeck )values (@CardID ,@StudentID ,@CancelCash ,@Canceldate ,@Canceltime ,@UserID ,@Ischeck )</strong></span>

      两个问题的答案已经很明显了,第一个问题是不能实现的,因为我需要的返回值是整条记录,而存储过程是不能返回整条记录的。第二个问题已经完美解决了。虽然没有成功,还是学到了很到东西,继续加油吧!

1 0