Подтвердить что ты не робот

SQL Server и С#: получить последний вставленный идентификатор

public static void CreateSocialGroup(string FBUID)
{
    string query = "INSERT INTO SocialGroup (created_by_fbuid) VALUES (@FBUID); SELECT @@IDENTITY AS LastID";

    using (SqlConnection connection = new SqlConnection(ConnectionString))
    {
        SqlCommand command = new SqlCommand(query, connection);
        command.Parameters.AddWithValue("@FBUID", FBUID);

        connection.Open();
        command.ExecuteNonQuery();
    }
}

Правильно ли это сделать? И как мне получить LastID в переменную? Благодаря

4b9b3361

Ответ 1

Предложение OUTPUT?

string query = "INSERT INTO SocialGroup (created_by_fbuid) 
                OUTPUT INSERTED.IDCol  --use real column here
                VALUES (@FBUID)";
...
int lastId = (int)command.ExecuteScalar();

Ответ 2

Вы можете использовать ExecuteScalar для получения последнего значения из Sqlcommand.

Функция scope_identity() более безопасна, чем идентификатор @@.

Ответ 3

Если ваш сервер поддерживает OUTPUT clause, вы можете попробовать его с помощью этого:

public static void CreateSocialGroup(string FBUID)
{
    string query = "INSERT INTO SocialGroup (created_by_fbuid) OUTPUT INSERTED.IDENTITYCOL VALUES (@FBUID)";

    using (SqlConnection connection = new SqlConnection(ConnectionString))
    {
        SqlCommand command = new SqlCommand(query, connection);
        command.Parameters.AddWithValue("@FBUID", FBUID);

        connection.Open();
        var _id = command.ExecuteScalar();
    }
}

Ответ 4

Лично я бы переписал код для использования параметров. Вы можете использовать параметр InputOutput или параметр Output. Однако использование возвращаемого значения в вашем SQL также будет работать.

Полные примеры этого можно найти в MSDN.

Я бы также использовал Scope_Identity(), а не @@Identity, это обеспечит вам идентификацию, относящуюся к текущей транзакции. Подробнее о Scope_Identity можно найти здесь.

Ответ 5

U может попробовать ExecuteScalar для получения значения LastID.

Ответ 6

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

Ответ 7

Используйте Stored Procedure только для запросов и используйте SCOPE_IDENTITY для получения максимального значения.

Ответ 8

SqlCommand command = new SqlCommand("select max(id) from SocialGroup ", connection);
int lastId = (int)command.ExecuteScalar();