Хотите использовать идентификатор, возвращенный из вставки при последующей вставке в транзакцию - PullRequest
5 голосов
/ 24 марта 2011

Я использую Rob Conery Massive для доступа к базе данных.Я хочу обернуть транзакцию вокруг пары вставок, но вторая вставка использует идентификатор, возвращенный из первой вставки.Для меня не очевидно, как это сделать в транзакции.Некоторая помощь будет оценена.

var commandList = new List<DbCommand>
    {
        contactTbl.CreateInsertCommand(new
            {
                newContact.Name,
                newContact.Contact,
                newContact.Phone,
                newContact.ForceChargeThreshold,
                newContact.MeterReadingMethodId,
                LastModifiedBy = userId,
                LastModifiedDate = modifiedDate,
            }),
        branchContactTbl.CreateInsertCommand(new
            {
                newContact.BranchId,
                ContactId = ????, <-- how to set Id as identity from previous command
            }),
    };

Ответы [ 2 ]

2 голосов
/ 24 марта 2011

Сделайте запрос между этими двумя вставками, этот метод из Massive может быть полезен:

public object Scalar(string sql, params object[] args) {
    object result = null;
    using (var conn = OpenConnection()) {
        result = CreateCommand(sql, conn, args).ExecuteScalar();
    }
    return result;
} 

Ваш sql будет = "select scope_identity ()"

ОБНОВЛЕНИЕ 2013/02/26

Снова глядя на код Massive, нет надежного способа восстановить последний вставленный идентификатор.

Код выше будет работать, только когда соединение, которое делает "select scope_identity ()", объединено в пул. (Это должно быть то же соединение, в котором выполнена вставка).

Massive * Метод 1014 * возвращает Dynamic, который содержит поле ID, заполненное «SELECT @@ IDENTITY». Он получает последний вставленный идентификатор из глобальной области видимости, что является очевидной ошибкой (очевидной в сценариях многопоточности).

1 голос
/ 26 февраля 2013

Можете ли вы просто сделать это в сохраненном процессе? Вы можете использовать scope_identity или, что еще лучше, предложение output, чтобы получить нужные вам значения. И все вставки во все таблицы находятся в одной транзакции, которую можно откатить в случае сбоя любой из них.

...