Как вернуть значение Indentity после вставки - PullRequest
1 голос
/ 09 февраля 2012

Учитывая следующий код (который в основном не имеет значения, за исключением двух последних строк), каким будет ваш метод, чтобы получить значение поля идентификатора для новой записи, которая была только что создана? Сделаете ли вы второй вызов к базе данных, чтобы получить ее на основе первичного ключа объекта (который может быть проблематичным, если его нет), или на основе последней вставленной записи (которая может быть проблематичной в многопоточных приложениях) или есть может быть, более разумный способ вернуть новое значение в то же время, когда вы делаете вставку?

Похоже, должен быть способ вернуть Identity на основе только что выполненной операции вставки, а не запрашивать ее на основе других средств.

public void Insert(O obj)
{
    var sqlCmd = new SqlCommand() { Connection = con.Conn };
    var sqlParams = new SqlParameters(sqlCmd.Parameters, obj);
    var props = obj.Properties.Where(o => !o.IsIdentity);

    InsertQuery qry = new InsertQuery(this.TableAlias);
    qry.FieldValuePairs = props.Select(o => new SqlValuePair(o.Alias, sqlParams.Add(o))).ToList();

    sqlCmd.CommandText = qry.ToString();
    sqlCmd.ExecuteNonQuery();
}

РЕДАКТИРОВАТЬ: Хотя этот вопрос не является дубликатом в самой строгой манере, он почти идентичен тому, который имеет несколько действительно хороших ответов: Лучший способ получить идентичность вставленной строки?

Ответы [ 4 ]

2 голосов
/ 09 февраля 2012

Это сильно зависит от вашего сервера базы данных. Например, для Microsoft SQL Server вы можете получить значение переменной @@ IDENTITY, которая содержит последнее назначенное значение идентификатора.

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

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

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

1 голос
/ 09 февраля 2012

Вы можете взглянуть на: эту ссылку .

Могу добавить, что во избежание того, что может существовать несколько строк, вы можете использовать «Транзакции», сделать методы Insert и select в одной транзакции.

Удачи.

1 голос
/ 09 февраля 2012

Афаик там не закончил путь.Я решил использовать сгенерированные клиентом идентификаторы (guid), чтобы мой метод генерировал идентификатор и возвращал его вызывающей стороне.

Возможно, вы можете проанализировать некоторые systables SqlServer, чтобы увидеть, что изменилось последним.Но у вас могут возникнуть проблемы с параллелизмом (что, если кто-то вставит очень похожую запись).

Поэтому я бы порекомендовал изменить стратегию и сгенерировать идентификаторы на клиентах

0 голосов
/ 09 февраля 2012

Правильный подход заключается в изучении sql.

. Вы можете выполнить команду SQL с последующим SELECT за один прогон, чтобы вы могли войти и вернуть назначенный идентификатор.

См.

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