SQL Server и C #: получить последний вставленный идентификатор - PullRequest
18 голосов
/ 24 мая 2011
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 в переменную? Спасибо

Ответы [ 8 ]

26 голосов
/ 24 мая 2011

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

string query = "INSERT INTO SocialGroup (created_by_fbuid) 
                OUTPUT INSERTED.IDCol  --use real column here
                VALUES (@FBUID)";
...
int lastId = (int)command.ExecuteScalar();
10 голосов
/ 24 мая 2011

Вы можете использовать ExecuteScalar, чтобы получить последнее значение из команды Sql.

Функция scope_identity () безопаснее, чем @@ identity.

8 голосов
/ 24 мая 2011

Если ваш сервер поддерживает 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();
    }
}
5 голосов
/ 24 мая 2011

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

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

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

3 голосов
/ 24 мая 2011

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

2 голосов
/ 24 мая 2011

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

0 голосов
/ 24 мая 2011

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

0 голосов
/ 24 мая 2011
SqlCommand command = new SqlCommand("select max(id) from SocialGroup ", connection);
int lastId = (int)command.ExecuteScalar();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...