none
在调用带参数的存储过程的时候,存储过程里有给参数赋值的语句,在C#代码中调用存储过程是还需要给参数赋值么? RRS feed

  • 问题

  • 我的存储过程代码为:
    CREATE PROCEDURE [dbo].[PR_CalculateEvaluateGrade]
     -- Add the parameters for the stored procedure here
       /*@count int, --存放临时表达数据记录数
       @i int, --存放循环变量
       @totalcount int, --存放循环记录次数
       @tutorshipid int, --存放指导关系ID
       @totalscore int, --存放最后的指导成绩
       @teachtaskno nvarchar(50), --存放选课号
       @success bit='1' output --表示对每个课头是否全部生成了评教成绩*/
       @success bit='1' output --表示对每个课头是否全部生成了评教成绩
    AS
     
    BEGIN 
     -- SET NOCOUNT ON added to prevent extra result sets from
     -- interfering with SELECT statements
     SET NOCOUNT ON; 

     declare  @count int --存放临时表达数据记录数
     declare  @i int --存放循环变量
     declare  @totalcount int --存放循环记录次数
     declare  @tutorshipid int --存放指导关系ID
     declare  @totalscore int --存放最后的指导成绩
     declare  @teachtaskno nvarchar(50) --存放选课号
     
        -- Insert statements for procedure here
     --创建一个临时表
     create table #TempTable(ID int identity(1,1),TutorShipID int,TeachTaskNo nvarchar(50),TotalScore int)
     --向临时表里插入数据
     Insert into #TempTable(TutorShipID,TeachTaskNo,TotalScore) select distinct EvaluateTeach.TutorshipID,
        vteachtask.no as teachtaskno,avg(evaluateteach.grade) as finalscore
     from vteachtask ,vteacher ,outline,term,tutorship,lab,arrangegroup,dept,evaluateteach
     where vteachtask.teacherusername=vteacher.username and vteachtask.years=term.years
     and vteachtask.termturn =term.termturn and term.iscurrentterm=1
     and tutorship.teacherusername=vteacher.username and tutorship.arrangegroupid=arrangegroup.id  and evaluateteach.teachtaskno=vteachtask.no
     group by EvaluateTeach.TutorshipID,vteachtask.NO
     order by EvaluateTeach.TutorshipID,teachtaskno asc

     select @count=count(1) from #TempTable --查询当前临时表的记录的数据数
     if(@count>0)
     BEGIN
     
     set @i=1 --指针变量初始化
     set @totalcount=0 --累计初始化
     while(@i<=@count) --开始循环
     BEGIN
     select @tutorshipid=TutorShipID,@teachtaskno=TeachTaskNO,@totalscore=TotalScore from #TempTable where ID=@i
     update EvaluateTeach set FinalScore=@totalscore where EvaluateTeach.TutorshipID=@tutorshipid and EvaluateTeach.TeachTaskNo=@teachtaskno
     set @i=@i+1 --循环递增
     set @totalcount=@totalcount+1  --记录加1
     END

     END
     
     if(@totalcount != @count)
     BEGIN
        set @success=0
     END

     drop table #TempTable  
    END
    GO

    我的调用代码为 :

     public int CalculateEvaluateGrade()
        {
            int Flag = 0;
            string sql = "PR_CalculateEvaluateGrade";
            //新建一个数据链接
            SqlConnection conn = new SqlConnection(SQLHelper.strConnectionString);
            //数据连接打开
            conn.Open();
            //开始一个事务
            SqlTransaction Trans = conn.BeginTransaction();
            //开始一个命令  
            SqlCommand cmd = new SqlCommand(sql,conn);
            //命令中有个事务
            cmd.Transaction = Trans;
            //命令执行是存储过程
            cmd.CommandType = CommandType.StoredProcedure;

            //SqlParameter success =cmd.Parameters.Add("@success", SqlDbType.Bit, 1);
            //success.Direction = ParameterDirection.Output;
            SqlParameter returnvalue = cmd.Parameters.Add("Return", SqlDbType.Bit, 1);
            returnvalue.Direction = ParameterDirection.ReturnValue;


            return Flag;
        }

    2009年12月26日 12:50

答案

  • 抱歉,没有细看你的代码。
    从你主题的描述来说,如果你的存储过程参数没有设置默认值的话,则必须在调用时传递对应参数的值。因此,如果某个参数是可传可不传的,就把它设置上一个默认值好了。另外,如果一个参数只是在存储过程内部使用的话,则似乎不需要把它作为存储过程的参数,而只需要作为存储过程内的一个局部变量好了。如果是需要利用参数作为输出之用,需要在参数后加上OUTPUT关键字,以表明此参数是输出参数。

    理解的越多,需要记忆的就越少
    • 已标记为答案 LTL007 2009年12月29日 3:11
    2009年12月27日 14:13
    版主