У меня есть приложение на C #, которое позволяет пользователям отправлять форму заявки.Приложение запрашивает имена родителей и если они состоят в браке.После отправки для каждого родителя создается новая запись пользователя.Если родители состоят в браке, мне нужно обновить поле SpouseID в каждой новой записи пользователя, указав идентификатор другого родителя.См. Пример таблицы ниже:
ID FirstName LastName SpouseID
---------------------------------
1 John Smith 2
2 Jenny Smith 1
3 Jim Jackson NULL
В настоящее время мой код обернут в оператор начала попытки, поэтому я не могу обновить поле SpouseID с помощью вновь созданных идентификаторов пользователей, пока оператор вставки не будет принят.Я могу переместить оператор, чтобы обновить поля SpouseID после оператора COMMIT TRANSACTION, но я все еще хочу иметь возможность откатить все, если есть проблема с обновлением полей SpouseID.
Возможно ли это?Любые идеи о том, как подойти к этому, будут с благодарностью.
Я включил упрощенную версию кода хранимой процедуры.
SET XACT_ABORT ON
BEGIN TRY
SET @OuterTransFlag = @@TRANCOUNT
IF @OuterTransFlag = 0
BEGIN TRANSACTION
IF (@UserIDP1 = 0)
BEGIN
INSERT INTO Users (Surname, Given1)
SELECT ISNULL(Surname, ''), ISNULL(GivenName, '')
FROM ParentInfo_Processed
WHERE CODE = @Code
SET @Parent1ID = SCOPE_IDENTITY()
END
IF (@UserIDP2 = 0)
BEGIN
INSERT INTO Users (Surname, Given1)
SELECT ISNULL(Surname, ''), ISNULL(GivenName, '')
FROM ParentInfo_Processed
WHERE CODE = @Code
SET @Parent2ID = SCOPE_IDENTITY()
END
IF (@ParentStatus = 'M')
BEGIN
UPDATE Users
SET SpouseID = @Parent1ID
WHERE ID = @Parent2ID
UPDATE Users
SET SpouseID = @Parent2ID
WHERE ID = @Parent1ID
END
IF @OuterTransFlag = 0 AND @@TRANCOUNT <> 0
COMMIT TRANSACTION
END TRY
BEGIN CATCH
DECLARE @em VARCHAR(2000)
SET @em = ERROR_MESSAGE()
IF @OuterTransFlag = 0 AND @@TRANCOUNT <> 0
ROLLBACK TRANSACTION
IF ISNULL(@em, '') <> ''
RAISERROR(@em, 16, 1)
RETURN(-1)
END CATCH