Проблема с получением последнего вставленного идентификатора из базы данных - asp.net - PullRequest
0 голосов
/ 31 августа 2011

Я пытаюсь добавить данные в таблицу пользователей (после регистрации). Сразу после добавления пользовательских данных в пользовательскую таблицу я не хочу создавать строку с userID в таблице 'profile' (1: 1), поэтому я использую транзакции здесь. Но проблема в том, что я не могу получить UserId пользователя после вставки (@@ Identity), когда код поступает в исключение строки «ExecuteScalar ()», которое я получаю: "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();
}

Ответы [ 3 ]

5 голосов
/ 31 августа 2011

Вы можете сделать это в одном операторе, используя предложение OUTPUT с операторами INSERT, UPDATE, DELETE или MERGE.

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

Вы можете вывести любые сгенерированные базой данных значения и прочитать их, используя SqlCommand.ExecuteReader (), который будет выполнять вставку и вывод вставленных значений в виде таблицы.

Примечание: не используйте форматирование строк, используйте параметры SQL, иначе вы уязвимы для внедрения SQL

3 голосов
/ 31 августа 2011

Один из комментариев был замечен - создайте ваши вставки, как это, и вы просите SQL-инъекцию.Вот что вы, вероятно, должны сделать:

var cmdAddUser = new SqlCommand(@"insert into tbl_users (
                                      [UserName],
                                      [Email],
                                      [Password],
                                      [PasswordSalt],
                                      [CreatedDate],
                                      [IsActivated],
                                      [IsLockedOut],
                                      [LastLoginDate],
                                      [LastLockedOutDate], 
                                      [NewEmailKey]) 
                                  values (@p1, @p2, @p3, @p4, @p4, @p6, @p7, @p8, @p9, @p10); 
                                  select SCOPE_IDENTITY();", conn, transaction);

cmdAddUser.Parameters.AddWithValue("@p1", user.UserName);
cmdAddUser.Parameters.AddWithValue("@p2", user.Email);
cmdAddUser.Parameters.AddWithValue("@p3", user.Password);
cmdAddUser.Parameters.AddWithValue("@p4", user.PasswordSalt);
cmdAddUser.Parameters.AddWithValue("@p5", user.CreateDate);
cmdAddUser.Parameters.AddWithValue("@p6", user.IsActivated);
cmdAddUser.Parameters.AddWithValue("@p7", user.IsLockedOut);
cmdAddUser.Parameters.AddWithValue("@p8", user.LastLoginDate);
cmdAddUser.Parameters.AddWithValue("@p9", user.LastLockedOutDate);
cmdAddUser.Parameters.AddWithValue("@p10", user.NewEmailKey);

var newId = (int)cmdAddUser.ExecuteNonQuery();

// Then proceed with your profile operations using the result

Возможно, вы уже это делаете, но я бы обернул ваши операции в оператор using, чтобы вы правильно распоряжались объектами базы данных.

0 голосов
/ 31 августа 2011

Вы должны создать сохраненный процесс на сервере, который будет вставлять нового пользователя и возвращать его идентификатор.

...