代码之家  ›  专栏  ›  技术社区  ›  WebMonster

从ADO.NET存储过程中获取返回值

  •  16
  • WebMonster  · 技术社区  · 16 年前

    我有一个存储过程,它在插入后返回唯一标识符 @@identity @RETURN_VALUE = [identifier] .

    在我的代码中,我添加了一个名为 @RETURN_VALUE ExecuteNonQuery()

     ALTER PROCEDURE dbo.SetAuction
     (
      @auctionID int,
      @itemID int,
      @auctionType tinyint,
      @reservationPrice int,
      @maxPrice int,
      @auctionEnd datetime,
      @auctionStart datetime,
      @auctionTTL tinyint,
      @itemName nchar(50),
      @itemDescription nvarchar(MAX),
      @categoryID tinyint,
      @categoryName nchar(50)
     ) AS
     IF @auctionID <> 0
      BEGIN
       BEGIN TRAN T1
       
       UPDATE Auction
       SET  AuctionType   = @auctionType,
         ReservationPrice = @reservationPrice,
         MaxPrice    = @maxPrice,
         AuctionEnd    = @auctionEnd,
         AuctionStart   = @auctionStart,
         AuctionTTL    = @auctionTTL
       WHERE AuctionID    = @auctionID;
       
       UPDATE Item
       SET
        ItemName  = @itemName,
        ItemDescription = @itemDescription
       WHERE
        ItemID = (SELECT ItemID FROM Auction WHERE AuctionID = @auctionID);
       
       COMMIT TRAN T1
       
       RETURN @auctionID
      END
     ELSE
      BEGIN
       BEGIN TRAN T1
        INSERT INTO Item(ItemName, ItemDescription, CategoryID)
        VALUES(@itemName, @itemDescription, @categoryID);
        
        INSERT INTO Auction(ItemID, AuctionType, ReservationPrice, MaxPrice, AuctionEnd, AuctionStart, AuctionTTL)
        VALUES(@@IDENTITY,@auctionType,@reservationPrice,@maxPrice,@auctionEnd,@auctionStart,@auctionTTL);
       COMMIT TRAN T1
       RETURN @@IDENTITY
      END
    

    C代码

    cmd.CommandText = cmdText;
    SqlParameter retval = new SqlParameter("@RETURN_VALUE", System.Data.SqlDbType.Int);
    retval.Direction = System.Data.ParameterDirection.ReturnValue;
    cmd.Parameters.Add(retval);
    cmd.Parameters.AddRange(parameters);
    cmd.Connection = connection;
    
    connection.Open();
    cmd.ExecuteNonQuery();
    
    return (int)cmd.Parameters["@RETURN_VALUE"].Value;
    
    5 回复  |  直到 5 年前
        1
  •  33
  •   Tim Cooper    14 年前

    刚试过我的盒子,这对我很有用:

    DROP PROCEDURE TestProc;
    GO
    CREATE PROCEDURE TestProc
    AS
       RETURN 123;
    GO
    

            string cnStr = "Server=.;Database=Sandbox;Integrated Security=sspi;";
            using (SqlConnection cn = new SqlConnection(cnStr)) {
                cn.Open();
                using (SqlCommand cmd = new SqlCommand("TestProc", cn)) {
                    cmd.CommandType = CommandType.StoredProcedure;
                    SqlParameter returnValue = new SqlParameter();
                    returnValue.Direction = ParameterDirection.ReturnValue;
                    cmd.Parameters.Add(returnValue);
    
                    cmd.ExecuteNonQuery();
                    Assert.AreEqual(123, (int)returnValue.Value);
                }
            }
    
        2
  •  5
  •   WebMonster    16 年前

    我解决了这个问题: 你必须把 SqlCommand.CommandType CommandType.StoredProcedure 以获取返回值和/或输出参数。我还没有找到任何关于这个的文档,但现在一切都正常了。

        3
  •  4
  •   Marc Gravell    16 年前

    你知道你的价值吗 EXEC SCOPE_IDENTITY()

    所以改变一下:

    COMMIT TRAN T1
    RETURN @@IDENTITY
    

    收件人:

    SET @auctionID = SCOPE_IDENTITY()
    COMMIT TRAN T1
    RETURN @auctionID
    

    )我也会换另一个 @@IDENTITY 到 作用域\标识() )


    作为次要优化,您还可以使用:

    return (int)retval.Value;
    

    但事情的这一面 从我所看到的情况来看,我已经“按原样”工作了(因此我将重点放在TSQL上)。

        4
  •  1
  •   Prashant Gupta    13 年前

    有些人也可以使用这种简单而简短的方法来计算SP的返回值

    在SQL中:

    Create Table TestTable 
    (
     Int Id
    )
    
    CREATE PROCEDURE Proc_TestProc
     @Id
     AS
       Begin
         Set NOCOUNT ON  //Use this line if you don't want to return any message from SQL
    
         Delete from TestTable where Id = @Id
         return 1
    
         Set NOCOUNT OFF //NOCOUNT OFF is Optional for NOCOUNT ON property
       End
    

    在C中#

    using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["TestConnectionString"].ToString()))
    using (SqlCommand cmd = new SqlCommand("Proc_TestProc", conn))
    {
     cmd.CommandType = CommandType.StoredProcedure;
    
     cmd.Parameters.AddWithValue("@Id", 1);
     var returnParameter = cmd.Parameters.Add("@ReturnVal", SqlDbType.Int);
     returnParameter.Direction = ParameterDirection.ReturnValue;
    
     conn.Open();
     cmd.ExecuteNonQuery();
     var result = returnParameter.Value;
    }
    

    还可以使用以下命令检查SQL中的返回值:

    DECLARE @return_status int;
    EXEC @return_status = dbo.[Proc_TestProc] 1;
    SELECT 'Return Status' = @return_status;
    print 'Returned value from Procedure: ' + Convert(varchar, @return_status); // Either previous or this line both will show you the value of returned value
    
        5
  •  0
  •   dreamafon    6 年前

    您可以使用以前在普通查询中使用的标准方式,但在Sql命令中,您必须在存储过程名称之前写入EXEC,并且不要像这样使用commandtype:

     SqlConnection con = new SqlConnection(["ConnectionString"])
        SqlCommand com = new SqlCommand("EXEC _Proc @id",con);
        com.Parameters.AddWithValue("@id",["IDVALUE"]);
        con.Open();
        SqlDataReader rdr = com.ExecuteReader();
        ArrayList liste = new ArrayList();
        While(rdr.Read())
        {
        liste.Add(rdr[0]); //if it returns multiple you can add them another arrays=> liste1.Add(rdr[1]) ..
        }
        con.Close();