Retrieving Return value from stored procedure

I have a stored procedure such as the following:

CREATE PROCEDURE procTest 
    -- Add the parameters for the stored procedure here
    @gameId int = NULL, 
    @memberID int = NULL,
    @mediatorID int = NULL,
    @id int OUTPUT
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    INSERT INTO tblSiteChallengeMember (gameId, creatorId, mediatorId, completed, dateAdded) VALUES (@gameId, @memberId, @mediatorID, 0, GETDATE())
END
GO

I need to return the ID of tblSiteChallengeMember, but I have no clue how to do it.

I have seen the example ’round about here, but I am afraid that:

SELECT TOP 1 @ProductName=PRODUCTNAME, @Quantity =quantity 
FROM Products P, [Order Details] OD, Orders O, Customers C 
WHERE C.CustomerID = @CustomerID 
AND C.CustomerID = O.CustomerID AND O.OrderID = OD.OrderID AND OD.ProductID = P.ProductID

Wont work, due to the fact that a single user could enter multiple times, and those times may not be unique at all.

How can I get the ID of the last row inserted to my ASP.net page?


Updated my Stored Procedure to:

ALTER PROCEDURE [dbo].[procCreateChallengeMember]
    -- Add the parameters for the stored procedure here
    @gameId int = NULL, 
    @memberID int = NULL,
    @mediatorID int = NULL,
    @id int OUTPUT
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    INSERT INTO tblSiteChallengeMember (gameId, creatorId, mediatorId, completed, dateAdded) VALUES (@gameId, @memberId, @mediatorID, 0, GETDATE())

    SELECT @id = SCOPE_IDENTITY()
END

SQL table is:

GO

/****** Object:  Table [dbo].[tblSiteChallengeMember]    Script Date: 10/17/2012 08:05:12 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[tblSiteChallengeMember](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [gameId] [int] NULL,
    [creatorId] [int] NOT NULL,
    [mediatorId] [int] NULL,
    [completed] [tinyint] NULL,
    [dateAdded] [datetime] NULL,
 CONSTRAINT [PK__tblSiteD__3213E83F628FA481] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

aspx.cs is:

SqlConnection db = DataConn.SqlConnection();

db.Open();
SqlTransaction transaction = db.BeginTransaction();

try
{
    int id = 0;

    SqlCommand sqlComm =
            new SqlCommand(
                "procCreateChallengeMember @gameId, @creatorId, @mediatorId, @id", db, transaction) { CommandType = CommandType.Text };

    sqlComm.Parameters.Add(new SqlParameter("@gameId", SqlDbType.Int)).Value = 1;
    sqlComm.Parameters.Add(new SqlParameter("@creatorId", SqlDbType.Int)).Value = 1;
    sqlComm.Parameters.Add(new SqlParameter("@mediatorId", SqlDbType.Int)).Value = 1;
    SqlParameter param = new SqlParameter("@id", SqlDbType.Int)
        {
            Direction = ParameterDirection.Output
        };

    sqlComm.Parameters.Add(param);
    sqlComm.ExecuteNonQuery();

    //if(param.Value != DBNull.Value)
    //{
        id = Convert.ToInt32(param.Value);
        Response.Write("One: " + id + "<br/>");
    //}
    transaction.Commit();
    //Response.Write("Two: " + sqlComm.Parameters["expr"].Value + "<br/>");

}
catch (Exception ess)
{
    transaction.Rollback();
    Response.Write(ess.Message);
}

Now getting the error
Object cannot be cast from DBNull to other types. (When I remove that IF statement)

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

“How can I get the ID of the last row inserted to my ASP.net page?”

SELECT @id = SCOPE_IDENTITY()

Get your stored procedure that inserts the row to return it.

EDIT

In response to follow up problem.

You need to make your SqlCommand aware that a parameter is on it’s way out.

   // Just below where you added your other params
   SqlParameter outputParam = new SqlParameter("@id", SqlDbType.Int)
   { 
      Direction = ParameterDirection.Output 
   };

   sqlComm.Parameters.Add(outputParam);

   sqlComm.ExecuteNonQuery();

Method 2

IF (@@error <> 1)
    BEGIN
    SELECT @id=scope_identity()
    END
ELSE
    BEGIN
    set @id=0
    RETURN 0 
    END

Method 3

Getting it from C# after using SCOPE_IDENTITY in your PROC

SqlParameter param = new SqlParameter("@Id", SqlType.Int);
param.Direction = ParameterDirection.Output;

command.Parameters.Add(param);
command.ExecuteNonQuery();

int id = 0;
if(param.Value != null)
   id = Convert.ToInt32(param.Value)

Method 4

Finally found a solution on my own (that works).

SQL:

-- =============================================
-- Author:      Darren Whitfield
-- Create date: 7 October 2012
-- Description: This will create a new challenge holder, and return its ID
-- =============================================
ALTER PROCEDURE [dbo].[procCreateChallengeMember]
    -- Add the parameters for the stored procedure here
    @gameId int = NULL, 
    @memberID int = NULL,
    @mediatorID int = NULL,
    @id int OUTPUT
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    -- SET NOCOUNT ON;

    -- Insert statements for procedure here
    INSERT INTO tblSiteChallengeMember (gameId, creatorId, mediatorId, completed, dateAdded) VALUES (@gameId, @memberId, @mediatorID, 0, GETDATE())

    SET @id = @@IDENTITY
    SELECT @id AS iden
END

aspx.cs:

string identity = "";
        SqlConnection db = DataConn.SqlConnection();

        db.Open();
        SqlTransaction transaction = db.BeginTransaction();

        try
        {

            SqlCommand sqlComm =
                    new SqlCommand(
                        "procCreateChallengeMember @gameId, @creatorId, @mediatorId, @id", db, transaction) { CommandType = CommandType.Text };

            sqlComm.Parameters.Add(new SqlParameter("@gameId", SqlDbType.Int)).Value = 2;
            sqlComm.Parameters.Add(new SqlParameter("@creatorId", SqlDbType.Int)).Value = 1;
            sqlComm.Parameters.Add(new SqlParameter("@mediatorId", SqlDbType.Int)).Value = 1;
            sqlComm.Parameters.Add(new SqlParameter("@id", SqlDbType.Int) { Direction = ParameterDirection.Output });

            using (SqlDataReader rdr = sqlComm.ExecuteReader())
            {
                while (rdr.Read())
                {
                    identity = rdr["iden"].ToString();
                }
            }

            Response.Write("One: " + identity + "<br/>");

            transaction.Commit();

        }
        catch (Exception ess)
        {
            transaction.Rollback();
            Response.Write(ess.Message);
        }

Returns ID
Thanks to all those who took their time to put in their thoughts and opinions. Without it, I would of never made it.


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x