Получение идентификатора последней вставленной строки из SQL с использованием C #

1

У меня этот код в моем приложении, и он работает нормально. Я не использовал SCOPE_IDENTITY, поскольку я слышал его старый метод. Может ли кто-нибудь проверить, применяю ли я правильный метод для получения последнего вставленного идентификатора записи? Будет ли это работать? Если я добавлю транзакцию?

using (SqlCommand com = new SqlCommand("INSERT INTO App_Users (UserName, Description) OUTPUT INSERTED.UserID " +
    "VALUES (@pUserName, @pDescription); ", con))
{


    com.Parameters.AddWithValue("@pUserName" ,userNameTxt.Text ); 

    com.Parameters.AddWithValue("@pDescription" , userDescription.Text); 



    int lastID = Convert.ToInt32(com.ExecuteScalar());

    foreach (ListViewItem lit in ListView3.Items)
    {
        HiddenField gid = (HiddenField)lit.FindControl("ListGroupID");
        int gidVal = 0;
        if (gid != null && gid.Value != null && !Int32.TryParse(gid.Value, out gidVal)) gidVal = 0;
        if (gidVal != 0)
        {
            com.CommandText = "INSERT INTO App_UserGroups (UserID, GroupID) " +
                "VALUES ( " +   lastID  + ", " + gidVal + ")";
            com.ExecuteNonQuery();
        }
    }
  • 0
    Почему тег mysql кстати? SCOPE_IDENTITY не старый. Кто это сказал? Вы когда-нибудь пытались его использовать?
  • 0
    если вы выполняете это непосредственно после вставки, вы можете использовать IDENT_CURRENT ('TableName') и вернуть это значение
Показать ещё 5 комментариев
Теги:

2 ответа

0

вы можете использовать scope_identity:

using (SqlCommand com = new SqlCommand("INSERT INTO App_Users (UserName, Description) " + " VALUES (@pUserName, @pDescription);" + "SELECT CAST(scope_identity() AS int)" , con))
0

Я столкнулся с тем же вопросом несколько дней назад, и я нашел этот пост SO, объясняющий каждый способ извлечения вставленного id из таблицы.

Чтобы ответить на ваш вопрос, оба OUTPUT_CLAUSE и IDENT_CURRENT могут использоваться в этом сценарии, даже если вы добавляете транзакцию, но я бы recomment IDENT_CURRENT потому что предложение OUTPUT вернет строки клиенту, даже если оператор встречает ошибки и откатывается назад.

Используйте его как @horHay, предложенный в комментариях как:

using (SqlCommand com = new SqlCommand("INSERT INTO App_Users (UserName, Description)"+ "VALUES (@pUserName, @pDescription) SELECT IDENT_CURRENT('App_Users'); ", con))


Я бы не предложил SCOPE_IDENTITY или @@IDENTITY потому что он может возвращать неправильные значения (null), если вы не используете SQL Server 2008 R2 SP2 или выше (исходная - последняя строка со страницы.), Особенно для вашего требования (вставка значения в другая таблица).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню