0

私はこのストアド プロシージャを持っており、ご覧のとおり、その中に 2 つの SCOPE_IDENTITY(); を使用しています。問題は、2 番目の scope_identity に対して @status 変数に割り当てることですが、保存された OUTPUT @status 変数を実行すると null になりますが、奇妙なことに、2 つの挿入が正常に機能します。

保存された 2 番目の挿入の scope_identity の出力として返したいと思います。手伝って頂けますか?

ALTER PROCEDURE [dbo].[sp_UserInsert]
(
@Username   nvarchar(50)=null,
@Password   nvarchar(50)=null,
@Email      nvarchar(50)=null,
@RoleId     int = 0,
@UserId     int = 0,
@typeOp     int,
@status     int = 0 OUTPUT
)   

AS
BEGIN

SET NOCOUNT ON;

if (@typeOp = 1)
/*Creazione nuovo recordo nella tabella Utenti*/
BEGIN
 if exists(select * from Gruppi where Gruppi.GroupID =@roleid)
     BEGIN
        INSERT INTO dbo.Utenti(Username,Password,Email) VALUES(@Username,@Password,@Email)
        set @UserId = SCOPE_IDENTITY()
        if (@UserId > 0)
            BEGIN
                INSERT INTO dbo.Ruoli(UserID,GroupID) VALUES(@UserId,@RoleId)

                set @status = @@rowcount
            END

     END

END


END

SQL Server Management Studio からストアド プロシージャを実行すると正常に動作するという問題がありますが、コードからストアド プロシージャを実行すると最初の挿入のみが機能します。これはコードです:

 string connectionString = ConfigurationManager.ConnectionStrings["SQLConnStr"].ConnectionString;

void SubmitNewUser_Click(Object sender, EventArgs e)
{
    string username = txtUsername.Text;
    string email = txtEmail.Text;       
    string password = txtPassword.Text;
    int ddlRoleId = Convert.ToInt32(ddlRoles.SelectedValue);

    if (!string.IsNullOrWhiteSpace(username) && !string.IsNullOrWhiteSpace(email) && !string.IsNullOrWhiteSpace(password) && ddlRoleId > 0)
    {
        if (CheckUsernameAvailability(username))
        {

            try
            {
                if (!string.IsNullOrWhiteSpace(connectionString))
                {
                    using (SqlConnection dbconn = new SqlConnection(connectionString))
                    {
                        dbconn.Open();

                        SqlCommand command = new SqlCommand("sp_UserInsert", dbconn);
                        command.CommandType = CommandType.StoredProcedure;
                        command.Parameters.AddWithValue("@Username", username);
                        command.Parameters.AddWithValue("@Password", password);
                        command.Parameters.AddWithValue("@Email", email);
                        command.Parameters.AddWithValue("@RoleId", 1);
                        command.Parameters.AddWithValue("@typeOp", 1);
                        command.ExecuteNonQuery();

                        dbconn.Close();
                    }
                }
            }

            catch (Exception ex)
            {
                // Add error handling here for debugging.
                // This error message should not be sent back to the caller.
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Exception " + ex.Message);
            }
        }
    }
}
4

1 に答える 1

0

私の知る限り、2 番目のテーブルには ID がありません。User_ID、Group_Id はテーブル内の一意のキーなので、そのまま使用できると思います

select * from dbo.Ruoil where User_ID = @User_ID and Group_ID = @RoleId

影響を受ける行があるかどうかを確認したい場合は、@@rowcountを使用できます

于 2013-08-12T19:12:36.147 に答える