SQL - Получить следующее значение столбца isIdentity - PullRequest
0 голосов
/ 21 марта 2012

Я работаю над системой управления контентом для обновлений, где администратор может добавлять, редактировать и удалять обновления.

В форме, где администратор добавляет обновление, я хочу создать текстовое поле, которое отображает следующее значение столбца isIdentity из базы данных с именем «Update_ID». Я не могу просто извлечь последнюю строку из базы данных и добавить к ней 1, поскольку, если администратор удалит последнюю запись в базе данных, значение в текстовом поле не будет отражать действительный «Update_ID» следующей строки.

Как это можно решить, пожалуйста? Есть ли способ получить фактическое значение следующего столбца isIdentity в базе данных? Спасибо:)

Ответы [ 2 ]

3 голосов
/ 21 марта 2012

Если вы хотите сделать что-то подобное, единственный эффективный способ - вставить пустую строку и вернуть эту строку пользователю для редактирования, потому что вы не можете знать, что происходит с следующим идентификатором.быть без блокировки таблицы для вставок, что, вероятно, не то, что вы хотите сделать.

Более эффективное решение может состоять в том, чтобы не заполнять поле Update_ID, когда пользователь вводит данные изначально, а затем информировать ихидентификатора, который вы только что создали, выбрав SCOPE_IDENTITY или возвращая значение из оператора вставки.

РЕДАКТИРОВАТЬ: Одна из возможных альтернатив для того, что вы хотите сделать (если вы решите обновить до SQLServer 2012) должен использовать новую функцию Sequence .Я никогда не использовал его раньше.

1 голос
/ 21 марта 2012

Вы можете получить последнее вставленное значение идентификатора в сеансе или в области таблицы, вот некоторые чтения:

Но вы должны помнить, что эти значения меняются при каждой вставке в таблицу, поэтому вы не можете им доверять. Лучший способ - не показывать эти значения впереди. В случае связанных ресурсов вы можете создать хранимую процедуру (или просто встроенный блок T-SQL), которая будет выполнять вставку в основную таблицу, извлекать SCOPE_IDENTITY и затем делать вставки в дочерние таблицы с полученным значением.

EDIT

Просто пример того, что я описал выше (с ADO.NET):

using (SqlConnection connection = new SqlConnection(_connectionString))
{
    connection.Open();

    SqlTransaction transaction = connection.BeginTransaction();

    int insertedIdentity;
    using (SqlCommand command = new SqlCommand("INSERT INTO TableNames(ColumnsList) VALUES(@ValuesList) SELECT @InsertedIdentity = SCOPE_IDENTITY()", connection, transaction))
    {
        command.CommandType = CommandType.Text;
        //Add any parameters required by INSERT here, then add parameter for SCOPE_IDENTITY
        ...
        command.Parameters.Add(new SqlParameter("@InsertedIdentity", SqlDbType.Decimal) { Direction = ParameterDirection.Output });
        command.ExecuteNonQuery();
        insertedIdentity = Convert.ToInt32(command.Parameters["@InsertedIdentity"].Value);
    }

    //Now you can make all the child inserts using insertedIdentity and transaction
    ...

    transaction.Commit();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...