我有一个C#应用程序,允许用户提交申请表。该应用程序询问父母姓名以及他们是否结婚。提交后,将为每个父母创建一个新的用户记录。如果父母已结婚,则需要使用另一父母的ID更新每个新用户记录中的SpouseID字段。请参见下面的示例表:
ID FirstName LastName SpouseID --------------------------------- 1 John Smith 2 2 Jenny Smith 1 3 Jim Jackson NULL
当前,我的代码包含在begin try语句中,因此在提交insert语句之前,无法使用新创建的用户ID更新SpouseID字段。我可以在COMMIT TRANSACTION语句之后移动将更新SpouseID字段的语句,但是如果更新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