none
问存储过程的“返回值” RRS feed

  • 问题

  • 有一个存储过程,如下:

    ALTER PROCEDURE  [dbo].[Usp_TransferTest] (
     @MeterNo    Char(20),
                  @MeterType  Char(4),
     @DATime     Datetime,
    -- @Qty        Decimal(18,6),
     @Unit       Char(4)
    )
    as 
    Begin
    Set Nocount On;

    Declare @DAYear       Char(4);
    Declare @DAMonth      Char(2);
    Declare @DADay        Char(2);
           Declare @DAHour        Char(2);
            Declare @Time          Char(10);
            Declare @AvgQty       Decimal(18,6);

    Declare @RowCnt1       Int;
    Declare @RowCnt2       Int;
    Declare @RowCnt3       Int;
    Declare @RowCnt4       Int;

    Set @DAYear  = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,120))),1,4);
    Set @DAMonth = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,120))),6,2);
    Set @DADay   = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,120))),9,2);
            Set @DAHour  = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,114))),1,2);
            Set @Time = Replace((Replace(CONVERT(varchar(13),@DATime, 20),'-','')),' ','');
            Set @AvgQty = (select AVG(Qty) from SpecialMonitorData where Replace((Replace

    (CONVERT(varchar(13), DATime, 20),'-','')),' ','')=@Time and MeterNo=@MeterNo)

            Set @RowCnt4 = (Select Count(*) From SpecialDataSumByHour Where MeterNo = 

    @MeterNo
     And MeterType = @MeterType And DADay = IsNull(@DAYear,'') + IsNull

    (@DAMonth,'') + IsNull(@DADay,'')
    And DAHour = @DAHour);

    If IsNull(@RowCnt4,0) = 0
    Begin
    Set @RowCnt4 = 0;
    End

    If @RowCnt4 > 0 
    Begin
    Update SpecialDataSumByHour Set AvgQty = @AvgQty
    Where MeterNo = @MeterNo 
    And MeterType = @MeterType 
     And  DADay = IsNull(@DAYear,'') + IsNull(@DAMonth,'') + 

    IsNull(@DADay,'')
    And DAHour = @DAHour ;

    End

    Else
    Begin
    Insert SpecialDataSumByHour

    (MeterNo,MeterType,DADay,DAHour,AvgQty,Unit)
    Select @MeterNo,@MeterType,IsNull(@DAYear,'') + IsNull

    (@DAMonth,'') + IsNull(@DADay,''),@DAHour,@AvgQty,@Unit;

    End

    End 

    问题:
        这样一个存储过程,当它执行成功了也不会有大于零的返回值。C#中执行存储过程的“Command”对象根本不知道,执行成功了吗???        它执行成功了,返回的值也是“-1”。

         怎样修改存储过程可以有一个返回值,当存储过程执行成功了,那么返回值为“1”???    主要指“Update”和“Insert”有一个成功就行了,那是判断条件。

    Science and technology is my lover.

    2013年1月11日 7:35

答案

全部回复

  • 你直接return一个0或者1就好了。


    family as water


    • 已编辑 Stone Z 2013年1月11日 8:28
    • 已建议为答案 TerryChuang 2013年1月11日 8:54
    • 取消建议作为答案 TerryChuang 2013年1月11日 9:19
    • 已标记为答案 starrycheng 2013年1月14日 5:10
    2013年1月11日 8:26
  • ALTER PROCEDURE  [dbo].[Usp_TransferTest] (
             @Return BIT OUTPUT,
     @MeterNo    Char(20),
          @MeterType  Char(4),
     @DATime     Datetime,
    -- @Qty        Decimal(18,6),
     @Unit       Char(4)
    )

    SET @Return=@@ROWCOUNT

    或是,

    select  @@ROWCOUNT   as   [Return]  

    这样两种方法,都不行啊。


    Science and technology is my lover.

    2013年1月11日 8:37
  • “return  @@ROWCOUNT”,这样也不行啊,大师。

    Command对象执行成功了,但是返回值还是“-1”。

    就算“return  1”,它还是返回“-1”。

    难道是:

     public int ExecuteNonQuery(string strSql, params SqlParameter[] paramter)
            {
                SqlCommand cmd = new SqlCommand(strSql, Connection);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddRange(paramter);
                int count = Convert.ToInt32(cmd.ExecuteNonQuery());
                connection.Close();
                //connection.Dispose();
                return count;
            }

    有问题???    但是这个方法直接执行“增加”、“删除”、“更新”都是返回值啊。


    Science and technology is my lover.


    2013年1月11日 8:42
  • 谢谢,大师。但是,还有一个问题。

    ALTER PROCEDURE  [dbo].[Usp_TransferDAListToSpecialMonitorData] (
     @MeterNo    Char(20),
          @MeterType  Char(4),
     @DATime     Datetime,
    -- @Qty        Decimal(18,6),
     @Unit       Char(4)
    )
    as 
    Begin
    Set Nocount On;

    Declare @DAYear       Char(4);
    Declare @DAMonth      Char(2);
    Declare @DADay        Char(2);
        Declare @DAHour        Char(2);
        Declare @Time          Char(10);
        Declare @AvgQty       Decimal(18,6);

    Declare @RowCnt1       Int;
    Declare @RowCnt2       Int;
    Declare @RowCnt3       Int;
    Declare @RowCnt4       Int;

    Set @DAYear  = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,120))),1,4);
    Set @DAMonth = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,120))),6,2);
    Set @DADay   = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,120))),9,2);
        Set @DAHour  = Substring(Ltrim(Rtrim(Convert(varchar(10),@DATime,114))),1,2);
        Set @Time = Replace((Replace(CONVERT(varchar(13),@DATime, 20),'-','')),' ','');
        Set @AvgQty = (select AVG(Qty) from SpecialMonitorData where Replace((Replace

    (CONVERT(varchar(13), DATime, 20),'-','')),' ','')=@Time and MeterNo=@MeterNo)



    Set @RowCnt4 = (Select Count(*) From SpecialDataSumByHour Where MeterNo = 

    @MeterNo
     And MeterType = @MeterType And DADay = IsNull(@DAYear,'') + IsNull

    (@DAMonth,'') + IsNull(@DADay,'')
    And DAHour = @DAHour);

    If IsNull(@RowCnt4,0) = 0
    Begin
    Set @RowCnt4 = 0;
    End
    If @RowCnt4 > 0 
    Begin
    Update SpecialDataSumByHour Set AvgQty = @AvgQty
    Where MeterNo = @MeterNo 
    And MeterType = @MeterType 
     And  DADay = IsNull(@DAYear,'') + IsNull(@DAMonth,'') + 

    IsNull(@DADay,'')
    And DAHour = @DAHour ;
    End
    Else
    Begin
    Insert SpecialDataSumByHour

    (MeterNo,MeterType,DADay,DAHour,AvgQty,Unit)
    Select @MeterNo,@MeterType,IsNull(@DAYear,'') + IsNull

    (@DAMonth,'') + IsNull(@DADay,''),@DAHour,@AvgQty,@Unit;
    End
    print  '执行了'
    --select  @@ROWCOUNT   as   [Return]
    return  @@ROWCOUNT

    --return  1

    End 

    问题:“Insert”或“Update”执行成功了后,“@@ROWCOUNT”的值并不会变为“1”啊???

    “@@ROWCOUNT”的值是记录插入或更新影响的行的吗???

    直接“Return  1”是可以获取的,但是有更新或是插入的时候“@@ROWCOUNT”也是“0”,Why???

    Science and technology is my lover.

    2013年1月11日 9:13
  • 另外你也可以試試看把Set Nocount On拿掉。

    以上說明若有錯誤請指教,謝謝。

    | 台灣 SQL PASS 社群 | SQL PASS Taiwan

    | 歡迎參觀我的BLOG - 積沙成塔

    2013年1月11日 9:16
  • 请搜索ParameterDirection.ReturnValue 和 RETURN (Transact-SQL)

    想不想时已是想,不如不想都不想。

    2013年1月11日 9:55
    版主