Click here to Skip to main content
15,905,785 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more: , +
I'm trying to use the SCOPE_IDENTITY from an Insert stored procedure and pass it for use in an Update statement as well. I've been trying to get this to work for almost 2 days now, any suggestions would be greatly appreciated. Here is my code:


Insert Stored Procedure Code:
ALTER PROCEDURE [dbo].InsertUser
(
	@UserID int OUTPUT,
	@FirstName nvarchar(50),
	@LastName nvarchar(50),
	@Username nvarchar(50),
	@Password nvarchar(50),
	@SecurityQuestionOption nvarchar(50),
	@SecurityAnswer nvarchar(50),
	@Address nvarchar(50),
	@City nvarchar(50),
	@State nvarchar(50),
	@ZipCode nvarchar(50),
	@PhoneNumber nvarchar(50),
	@EMail nvarchar(50),
	@LastLogin datetime,
	@IsActive bit,
	@IsAdmin bit
)
AS
	SET NOCOUNT ON;
INSERT INTO [Users] ([FirstName], [LastName], [Username], [Password], [SecurityQuestionOption], [SecurityAnswer], [Address], [City], [State], [ZipCode], [PhoneNumber], [EMail], [LastLogin], [IsActive], [IsAdmin]) VALUES (@FirstName, @LastName, @Username, @Password, @SecurityQuestionOption, @SecurityAnswer, @Address, @City, @State, @ZipCode, @PhoneNumber, @EMail, @LastLogin, @IsActive, @IsAdmin);
	
SELECT @UserID = SCOPE_IDENTITY();




Here's the Register.aspx.cs code for inserting:
protected void ButtonRegisterUser_Click(object sender, EventArgs e)
    {
        try
        {
            //Inserts user into database if student is selected, password is encrypted
            SqlCommand cmd = new SqlCommand("InsertUser", cn);
            cmd.Parameters.Add("@UserID", SqlDbType.Int).Direction = ParameterDirection.Output;
            cmd.Parameters.Add("@FirstName", SqlDbType.NVarChar).Value = TextBoxFName.Text;
            cmd.Parameters.Add("@LastName", SqlDbType.NVarChar).Value = TextBoxLName.Text;
            cmd.Parameters.Add("@Username", SqlDbType.NVarChar).Value = TextBoxUsername.Text;
            cmd.Parameters.Add("@Password", SqlDbType.NVarChar).Value = FormsAuthentication.HashPasswordForStoringInConfigFile(TextBoxPassword.Text, "SHA1");
            cmd.Parameters.Add("@SecurityQuestionOption", SqlDbType.NVarChar).Value = DropDownListSecurityQuestion.SelectedValue;
            cmd.Parameters.Add("@SecurityAnswer", SqlDbType.NVarChar).Value = TextBoxSecurityAnswer.Text;
            cmd.Parameters.Add("@Address", SqlDbType.NVarChar).Value = TextBoxAddress.Text;
            cmd.Parameters.Add("@City", SqlDbType.NVarChar).Value = TextBoxCity.Text;
            cmd.Parameters.Add("@State", SqlDbType.NVarChar).Value = DropDownListState.SelectedValue;
            cmd.Parameters.Add("@ZipCode", SqlDbType.NVarChar).Value = TextBoxZipCode.Text;
            cmd.Parameters.Add("@PhoneNumber", SqlDbType.NVarChar).Value = TextBoxPhoneNumber.Text;
            cmd.Parameters.Add("@EMail", SqlDbType.NVarChar).Value = TextBoxEmailAddress.Text;
            cmd.Parameters.Add("@LastLogin", SqlDbType.DateTime).Value = DateTime.Now.ToString();
            cmd.Parameters.Add("@IsActive", SqlDbType.Bit).Value = "True";
            cmd.Parameters.Add("@IsAdmin",SqlDbType.Bit).Value = "False";
            cmd.CommandType = CommandType.StoredProcedure;
            cn.Open();
            cmd.ExecuteNonQuery();
            int ID = Convert.ToInt32(cmd.Parameters["@UserId"].Value);
            //UserID that will be passed into session to be checked throughout program
            Session["UserId"] = ID;
            cn.Close();

            //username that will be passed onto confirm registration
            Session["uname"] = TextBoxUsername.Text;

            //Information session to be passed to the confirm registration
            Session["fname"] = TextBoxFName.Text;
            Session["lname"] = TextBoxLName.Text;
            Session["address"] = TextBoxAddress.Text;
            Session["city"] = TextBoxCity.Text;
            Session["state"] = DropDownListState.SelectedValue;
            Session["zip"] = TextBoxZipCode.Text;
            Session["phone"] = TextBoxPhoneNumber.Text;
            Session["email"] = TextBoxEmailAddress.Text;
            Response.Redirect("~/ConfirmUserRegistration.aspx");
        }
        catch (Exception ex)
        {
            LabelMessage.Text = ex.Message.ToString();
        }
    }



Here's the Update Stored Procedure code:
ALTER PROCEDURE [dbo].UpdateUser
(
	@FirstName nvarchar(50),
	@LastName nvarchar(50),
	@Address nvarchar(50),
	@City nvarchar(50),
	@State nvarchar(50),
	@ZipCode nvarchar(50),
	@PhoneNumber nvarchar(50),
	@EMail nvarchar(50),
	@Original_UsersID int,
	@UsersID int
)
AS
	SET NOCOUNT OFF;
UPDATE [Users] SET [FirstName] = @FirstName, [LastName] = @LastName, [Address] = @Address, [City] = @City, [State] = @State, [ZipCode] = @ZipCode, [PhoneNumber] = @PhoneNumber, [EMail] = @EMail WHERE (([UsersID] = @Original_UsersID));
	
SELECT UsersID, FirstName, LastName, Username, Password, SecurityQuestionOption, SecurityAnswer, Address, City, State, ZipCode, PhoneNumber, EMail, LastLogin, IsActive, IsAdmin FROM Users WHERE (UsersID = @UsersID)



And finally here's the code for the insert, UpdateRegister.aspx.xs:
C#
protected void ButtonUpdate_Click(object sender, EventArgs e)
    {
            //Updates contact information
            cmd = new SqlCommand("UpdateUser", cn);
            cmd.Parameters.Add("@UsersID", SqlDbType.Int).Value = Session["UserId"];
            cmd.Parameters.Add("@Original_UsersID", SqlDbType.Int).Value = Session["UserId"];
            cmd.Parameters.Add("@FirstName", SqlDbType.NVarChar).Value = TextBoxFName.Text;
            cmd.Parameters.Add("@LastName", SqlDbType.NVarChar).Value = TextBoxLName.Text;
            cmd.Parameters.Add("@Address", SqlDbType.NVarChar).Value = TextBoxAddress.Text;
            cmd.Parameters.Add("@City", SqlDbType.NVarChar).Value = TextBoxCity.Text;
            cmd.Parameters.Add("@State", SqlDbType.NVarChar).Value = DropDownListState.SelectedValue;
            cmd.Parameters.Add("@ZipCode", SqlDbType.NVarChar).Value = TextBoxZipCode.Text;
            cmd.Parameters.Add("@PhoneNumber", SqlDbType.NVarChar).Value = TextBoxPhoneNumber.Text;
            cmd.Parameters.Add("@EMail", SqlDbType.VarChar).Value = TextBoxEmailAddress.Text;
            cmd.CommandType = CommandType.StoredProcedure;
            cn.Open();
            cmd.ExecuteNonQuery();
            cn.Close();
            Response.Redirect("~/Login.aspx");
    }
Posted
Comments
fjdiewornncalwe 24-Oct-12 14:41pm    
Are you getting back the valid value for @UserID from the insert query?
If not, you could try SET @UserID = SCOPE_IDENTITY() instead of SELECT
JasonMacD 24-Oct-12 14:59pm    
I just tried changing it to SET @UserID = SCOPE_IDENTITY() and I get the same results. No error occurs, but no data gets update either. Thanks for the help though. Any other ideas?

1 solution

Since you were not able to get it working i spent some time with your code and i just had to use what Marcus Kramer suggested SET @UserID = SCOPE_IDENTITY(), it worked and i got the autogenerated UserID inside int ID
C#
protected void btnSave_Click(object sender, EventArgs e)
       {
           SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["TEST"].ToString());
           SqlCommand cmd = new SqlCommand("InsertUser", cn);
           cmd.Parameters.Add("@UserID", SqlDbType.Int).Direction = ParameterDirection.Output;
           cmd.Parameters.Add("@FirstName", SqlDbType.NVarChar).Value = "FirstName";
           cmd.Parameters.Add("@LastName", SqlDbType.NVarChar).Value = "LastName";
           cmd.Parameters.Add("@Username", SqlDbType.NVarChar).Value = "Username";
           cmd.Parameters.Add("@Password", SqlDbType.NVarChar).Value = "Password";
           cmd.Parameters.Add("@SecurityQuestionOption", SqlDbType.NVarChar).Value = "SecurityQuestionOption";
           cmd.Parameters.Add("@SecurityAnswer", SqlDbType.NVarChar).Value = "SecurityAnswer";
           cmd.Parameters.Add("@Address", SqlDbType.NVarChar).Value ="Address";
           cmd.Parameters.Add("@City", SqlDbType.NVarChar).Value = "City";
           cmd.Parameters.Add("@State", SqlDbType.NVarChar).Value = "State";
           cmd.Parameters.Add("@ZipCode", SqlDbType.NVarChar).Value = "ZipCode";
           cmd.Parameters.Add("@PhoneNumber", SqlDbType.NVarChar).Value = "PhoneNumber";
           cmd.Parameters.Add("@EMail", SqlDbType.NVarChar).Value = "EMail";
           cmd.Parameters.Add("@LastLogin", SqlDbType.DateTime).Value = DateTime.Now;
           cmd.Parameters.Add("@IsActive", SqlDbType.Bit).Value = "True";
           cmd.Parameters.Add("@IsAdmin", SqlDbType.Bit).Value = "False";
           cmd.CommandType = CommandType.StoredProcedure;
           cn.Open();
           cmd.ExecuteNonQuery();
           int ID = Convert.ToInt32(cmd.Parameters["@UserId"].Value);

           cn.Close();
       }
This is the stored procedure i used
SQL
ALTER PROCEDURE [dbo].InsertUser
(
	@UserID int OUTPUT,
	@FirstName nvarchar(50),
	@LastName nvarchar(50),
	@Username nvarchar(50),
	@Password nvarchar(50),
	@SecurityQuestionOption nvarchar(50),
	@SecurityAnswer nvarchar(50),
	@Address nvarchar(50),
	@City nvarchar(50),
	@State nvarchar(50),
	@ZipCode nvarchar(50),
	@PhoneNumber nvarchar(50),
	@EMail nvarchar(50),
	@LastLogin datetime,
	@IsActive bit,
	@IsAdmin bit
)
AS
	SET NOCOUNT ON;
INSERT INTO [Users] ([FirstName], [LastName], [Username], [Password], [SecurityQuestionOption], [SecurityAnswer], [Address], [City], [State], [ZipCode], [PhoneNumber], [EMail], [LastLogin], [IsActive], [IsAdmin]) VALUES (@FirstName, @LastName, @Username, @Password, @SecurityQuestionOption, @SecurityAnswer, @Address, @City, @State, @ZipCode, @PhoneNumber, @EMail, @LastLogin, @IsActive, @IsAdmin);
	
SET @UserID = SCOPE_IDENTITY();
and this is the table i used
SQL
CREATE Table Users(
   UserID int IDENTITY(1,1) ,
   FirstName nvarchar(50),
   LastName nvarchar(50),
   Username nvarchar(50),
   [Password] nvarchar(50),
   SecurityQuestionOption nvarchar(50),
   SecurityAnswer nvarchar(50),
   [Address] nvarchar(50),
   City nvarchar(50),
   [State] nvarchar(50),
   ZipCode nvarchar(50),
   PhoneNumber nvarchar(50),
   EMail nvarchar(50),
   LastLogin datetime,
   IsActive bit,
   IsAdmin bit
)

What i suggested previously wasnt needed and I am able to receive back the output parameter even without using ExecuteScalar().

Hope this helps.
 
Share this answer
 
v4
Comments
JasonMacD 25-Oct-12 9:08am    
Thanks Cool Coder that produced the same output. The update statement doesn't throw an error, and redirects to the login page upon button click, but no data is updated. It was also doing this with ExecuteNonQuery
TheCoolCoder 26-Oct-12 0:09am    
Take a look at the the updated solution.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900