VB.net вставляет в несколько связанных таблиц с помощью хранимой процедуры. Только первая таблица получает вставленную строку

Хранимая процедура ins_address работает, если используется автономно, без ошибок. При использовании кода VB (показанного ниже) строка не вставляется в tbl_AddressEntity. tbl_Address работает, все в порядке. Я ломал голову почти два дня и готов прыгнуть с обрыва. Кто-нибудь может подсказать, почему строка не вставляется во вторую таблицу? Спасибо.

`

ALTER PROCEDURE [dbo].[ins_address]
@AddressLine1 AS VARCHAR(60),
@AddressLine2 AS VARCHAR(60),
@AddressLine3 AS VARCHAR(60),
@TownText AS VARCHAR(30),
@CountyText AS VARCHAR(30),
@PostcodeTownDistrictID AS INT,
@PostcodeOutwardCode AS VARCHAR(4),
@PostcodeInwardCode AS VARCHAR(3),
@SiteID AS INT,
@CompanyBranchID AS INT,
@PersonID AS INT,
@AddressTypeID AS INT,
@AddressID AS INT = -1 OUTPUT

AS 

BEGIN TRY
INSERT INTO tbl_Address 
(
AddressLine1, 
AddressLine2, 
AddressLine3, 
TownText, 
CountyText,
PostcodeTownDistrictID,
PostcodeOutwardCode,
PostcodeInwardCode
)
VALUES 
(
@AddressLine1, 
@AddressLine2, 
@AddressLine3, 
@TownText, 
@CountyText,
@PostcodeTownDistrictID,
@PostcodeOutwardCode,
@PostcodeInwardCode
);

RETURN SCOPE_IDENTITY();

SELECT @AddressID = SCOPE_IDENTITY();

INSERT INTO tbl_AddressEntity
(
AddressID,
SiteID,
CompanyBranchID,
PersonID,
AddressTypeID
)
VALUES
(
@AddressID,
@SiteID,
@CompanyBranchID,
@PersonID,
@AddressTypeID
);

END TRY

BEGIN CATCH
 DECLARE
        @ErrorMessage nvarchar(2048)
        ,@ErrorSeverity int
        ,@ErrorState int

    SELECT
        @ErrorMessage = ERROR_MESSAGE()
        ,@ErrorSeverity = ERROR_SEVERITY()
        ,@ErrorState = ERROR_STATE();

IF @@TRANCOUNT > 0

    RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState);

END CATCH

`


`

Private Sub UBSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UBSave.Click
          Try

                    If Not formOptions(0).Contains("Company Customer") Then
                        'Force commit of data changes to DS
                        **Me.UGAddresses.UpdateData()**
                        Me.UGContactInformation.UpdateData()

                        'Merge text boxes into DS
                        getNonCompanyCustomerFields()

                        'Save the contact first!
                        kernel.updateContact(Me.DsContact1)

                        'Now assuming we have the PKID from the contact insert, update associations to match!
                        If formOptions(0).Contains("New") Then
                            For Each row As DataRow In DsAddress1.Tables(0).Rows
                                If row.RowState = DataRowState.Added Then
                                    If row.Item("PersonID") Is System.DBNull.Value Then
                                        row.Item("PersonID") = DsContact1.Tables(0).Rows(0).Item("PersonID")
                                    End If
                                End If
                            Next
                            For Each row As DataRow In DsContactInfo1.Tables(0).Rows
                                If row.RowState = DataRowState.Added Then
                                    If row.Item("PersonID") Is System.DBNull.Value Then
                                        row.Item("PersonID") = DsContact1.Tables(0).Rows(0).Item("PersonID")
                                    End If
                                End If
                            Next
                            If Me.UTCMain.Tabs("Customer").Visible Then
                                Me.DsCustomers1.Tables(0).Rows(0).Item("PersonID") = DsContact1.Tables(0).Rows(0).Item("PersonID")
                            End If
                        End If

                        **kernel.updateAddresses(Me.DsAddress1)**
                        kernel.updateContactInfo(Me.DsContactInfo1)
                        If Me.UTCMain.Tabs("PersonCustomer").Visible Then
                            kernel.updateCustomer(Me.DsCustomers1)
                        End If
                        Me.Text = Me.Text.Replace(" *", "")

                        'Company Customer
                    Else
                        getCompanyCustomerFields()
                        kernel.updateCustomer(Me.DsCustomers1)
                        Me.Text = Me.Text.Replace(" *", "")
                    End If
                Catch ex As Exception
                    MsgBox("Exception thrown during save : " & ex.Message, MsgBoxStyle.Exclamation)
                    mySharedFunctions.LogProgress("frmContact.UBSave_Click - Error : " & ex.Message & vbCrLf & ex.StackTrace)
                    If Not ex.InnerException Is Nothing Then
                        mySharedFunctions.LogProgress("Inner exception : " & ex.InnerException.Message)
                    End If
                End Try
        End Sub

`


Процедура обновления адаптера данных: `

Public Sub updateAddresses(ByRef dsTemp As dsAddress)

            'For inserts we're passing back the new PKID amd syncing with the dataset via the source column mapping on the insert command. 
            'So we should be able to update by ref.
            Me.SqlDaAddress.Update(dsTemp)
        End Sub

`


Набор данных DsAddress1 содержит одну таблицу, содержащую результаты этого оператора select в соответствующей хранимой процедуре: `

ALTER PROCEDURE [dbo].[get_address_by_companybranch_or_person]
/*@SiteID AS INT = -1,*/
@CompanyBranchID AS INT = -1,
@PersonID AS INT = -1

AS

IF @CompanyBranchID != -1
BEGIN

    SELECT     dbo.tbl_Address.AddressID, dbo.tbl_Address.AddressLine1, dbo.tbl_Address.AddressLine2, dbo.tbl_Address.AddressLine3, 
                      dbo.tbl_Address.TownText, dbo.tbl_Address.CountyText, dbo.tbl_Address.PostcodeTownDistrictID, dbo.tbl_Address.PostcodeOutwardCode, 
                      dbo.tbl_Address.PostcodeInwardCode, dbo.tbl_AddressEntity.SiteID, dbo.tbl_AddressEntity.CompanyBranchID, dbo.tbl_AddressEntity.PersonID, 
                      dbo.tbl_AddressEntity.AddressTypeID
    FROM         dbo.tbl_Address INNER JOIN
                      dbo.tbl_AddressEntity ON dbo.tbl_Address.AddressID = dbo.tbl_AddressEntity.AddressID
    WHERE     CompanyBranchID = @CompanyBranchID

END
ELSE

BEGIN

    SELECT     dbo.tbl_Address.AddressID, dbo.tbl_Address.AddressLine1, dbo.tbl_Address.AddressLine2, dbo.tbl_Address.AddressLine3, 
                      dbo.tbl_Address.TownText, dbo.tbl_Address.CountyText, dbo.tbl_Address.PostcodeTownDistrictID, dbo.tbl_Address.PostcodeOutwardCode, 
                      dbo.tbl_Address.PostcodeInwardCode, dbo.tbl_AddressEntity.SiteID, dbo.tbl_AddressEntity.CompanyBranchID, dbo.tbl_AddressEntity.PersonID, 
                      dbo.tbl_AddressEntity.AddressTypeID
    FROM         dbo.tbl_Address INNER JOIN
                      dbo.tbl_AddressEntity ON dbo.tbl_Address.AddressID = dbo.tbl_AddressEntity.AddressID 
    WHERE   PersonID = @PersonID


END

`


person No1fan    schedule 31.08.2012    source источник


Ответы (1)


Почему эта линия?

RETURN SCOPE_IDENTITY(); 

В этот момент вы выходите из сохраненного процесса, не выполняя оставшийся код.

MSDN говорит

Exits unconditionally from a query or procedure. RETURN is immediate and complete 
and can be used at any point to exit from a procedure, batch, or statement block. 
Statements that follow RETURN are not executed. 

... и пожалуйста, не прыгайте.... :-)

person Steve    schedule 31.08.2012
comment
Гах! Не имел представления! Я взял базу данных у кого-то другого, и мне пришлось настроить множество хранимых процедур и кода. Спасибо за помощь. Думаю, это объясняет, почему tbl_AddressEntity не получает строки! :-) - person No1fan; 03.09.2012
comment
Рад помочь. Если мой ответ помог вам решить вашу проблему, пожалуйста, найдите немного времени, чтобы прочитать FAQ Как принимать ответы - person Steve; 04.09.2012