从数据库获取最后一个插入ID的问题 - asp.net

111*_*110 0 c# database sql-server asp.net transactions

我正在尝试将数据添加到User表(注册后).在将用户数据添加到用户表后,我不想立即在'profile'表(1:1)中使用userID创建行,这就是我在这里使用事务的原因.但问题是,当代码进入'ExecuteScalar()'行异常时,我收到后,我无法获得用户的UserId(@@ Identity)"Object reference not set to an instance of an object."

    string sqlAddUser = string.Format("insert into tbl_users ([UserName],[Email],[Password],[PasswordSalt],[CreatedDate],[IsActivated],[IsLockedOut],[LastLoginDate],[LastLockedOutDate], [NewEmailKey]) values ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}', '{9}')",
        user.UserName, user.Email, user.Password, user.PasswordSalt, user.CreatedDate, user.IsActivated, user.IsLockedOut, user.LastLockedOutDate, user.LastLoginDate, user.NewEmailKey);

    SqlCommand cmdAddUser = new SqlCommand(sqlAddUser, conn, transaction);
    int result = cmdAddUser.ExecuteNonQuery();

    SqlCommand cmdGetLastIdentity = new SqlCommand("SELECT @@IDENTITY", conn, transaction);                        
    int i = (int)cmdGetLastIdentity.ExecuteScalar();

    string sqlAddUserProfile = string.Format("insert into tbl_profile (UserId) values ({0})", i);
    SqlCommand cmdAddUserProfile = new SqlCommand(sqlAddUserProfile, conn, transaction);

    cmdAddUserProfile.ExecuteNonQuery();

    transaction.Commit();

    return GetUser(username);
}
catch (Exception ex)
{
    transaction.Rollback();
}
Run Code Online (Sandbox Code Playgroud)

Vas*_*sea 5

您可以使用带有INSERT,UPDATE,DELETE或MERGE语句的OUTPUT子句在单个语句中执行此操作.

cmd.CommandText = "INSERT INTO tbl_user (...) OUTPUT inserted.Id VALUES (...)";
var id = Convert.ToInt32(cmd.ExecuteScalar());
Run Code Online (Sandbox Code Playgroud)

您可以输出任何数据库生成的值,并使用SqlCommand.ExecuteReader()读取值,这将执行插入和输出插入的值作为表.

注意:不要使用字符串格式化,使用sql参数,否则你很容易受到sql注入