0

如何在 ssis 2005 中解决这个问题?我使用脚本组件进行验证。

我正在使用 VB 脚本验证脚本组件中的每一列。同时导入大量数据超过5000万。如果任何一列值根据我的验证脚本失败。那个时候在 ssis 中出现以下错误(尝试锁定变量时检测到死锁。16 次尝试后无法获取锁。锁超时。)

Public Overrides Sub ValidateColumn_ProcessInputRow(ByVal Row As ValidateColumnBuffer) Try Row.IsSkipped = False '声明并设置变量 Dim Var As IDTSVa​​riables90 = Nothing Dim str As String

        Me.VariableDispenser.GetVariables(Var)
        Me.VariableDispenser.LockForRead("User::strEligibilityKeyEmptyMsg")
        Me.VariableDispenser.LockForRead("User::strMemberIDEmptyMsg")
        Me.VariableDispenser.LockForRead("User::strServiceFromDateEmptyMsg")
        Me.VariableDispenser.LockForRead("User::strServiceToDateEmptyMsg")
        Me.VariableDispenser.LockForRead("User::strDxCode1EmptyMsg")
        Me.VariableDispenser.LockForRead("User::strAllowedAmountEmptyMsg")
        Me.VariableDispenser.LockForRead("User::strPaidAmountEmptyMsg")
        Me.VariableDispenser.LockForRead("User::strPaidDateEmptyMsg")
        Me.VariableDispenser.LockForRead("User::strFacilityIDEmptyMsg")
        Me.VariableDispenser.LockForRead("User::strServiceTypeEmptyMsg")
        Me.VariableDispenser.LockForRead("User::strServiceFromDateInvalidMsg")
        Me.VariableDispenser.LockForRead("User::strPaidDateInvalidMsg")
        Me.VariableDispenser.LockForRead("User::strServiceToDateInvalidMsg")

        'Field length and Expression validation
        Row.RowId = intRowId + 1
        intRowId = intRowId + 1
        Row.IsValidationSuccess = True

        'Required field validation
        'User::strEligibilityKeyEmptyMsg - Eligibility Key is empty !
        If (Row.EligibilityKey_IsNull Or Row.EligibilityKey.Trim().Length = 0) Then
            Row.IsSkipped = True
            Row.ErrorDesc = Var("User::strEligibilityKeyEmptyMsg").Value.ToString()
            Return
        End If

        'User::strMemberIDEmptyMsg - MemberID is empty !
        'If (Row.MemberIDClaimantID_IsNull Or Row.MemberIDClaimantID.Trim().Length = 0) Then
        '    Row.IsSkipped = True
        '    Row.ErrorDesc = Var("User::strMemberIDEmptyMsg").Value.ToString()
        '    Return
        'End If
        'User::strServiceFromDateEmptyMsg - ServiceFromDate is empty !
        If (Row.ServiceFromDate_IsNull Or Row.ServiceFromDate.Trim().Length = 0) Then
            Row.IsSkipped = True
            Row.ErrorDesc = Var("User::strServiceFromDateEmptyMsg").Value.ToString()
            Return
        End If

        'strServiceFromDateEmptyMSg - Invalid ServiceFromDate ! 
        Dim ServiceFromDate1 As Match = Regex.Match(Row.ServiceFromDate, "^([1][012]|[0]?[1-9])[/]([3][01]|[12]\d|[0]?[1-9])[/]([1-8][0-9][0-9][0-9]|9000)$")
        'Dim ServiceFromDate1 As Match = Regex.Match(Row.ServiceFromDate, "^(([1-9])|(0[1-9])|(1[0-2]))\/(([0-9])|([0-2][0-9])|(3[0-1]))\/(([0-9][0-9])|([1-9][0,9][0-9][0-9]))$")
        If Not ServiceFromDate1.Success Then
            Row.IsSkipped = True
            Row.ErrorDesc = "Invalid ServiceFromDate"
            Return
        End If


        'User::strServiceToDateEmptyMsg - ServiceToDate is empty !
        If (Row.ServiceToDate_IsNull Or Row.ServiceToDate.Trim().Length = 0) Then
            Row.IsSkipped = True
            Row.ErrorDesc = Var("User::strServiceToDateEmptyMsg").Value.ToString()
            Return
        End If

        'strServiceToDateEmptyMSg - Invalid ServiceToDate ! 
        Dim ServiceToDate1 As Match = Regex.Match(Row.ServiceToDate, "^([1][012]|[0]?[1-9])[/]([3][01]|[12]\d|[0]?[1-9])[/]([1-8][0-9][0-9][0-9]|9000)$")
        'Dim ServiceToDate1 As Match = Regex.Match(Row.ServiceToDate, "^(([1-9])|(0[1-9])|(1[0-2]))\/(([0-9])|([0-2][0-9])|(3[0-1]))\/(([0-9][0-9])|([1-9][0,9][0-9][0-9]))$")
        If Not ServiceToDate1.Success Then
            Row.IsSkipped = True
            Row.ErrorDesc = "Invalid ServiceToDate"
            Return
        End If

        'User::strDxCode1EmptyMsg - DxCode1 is empty ! 
        If (Row.DxCode1_IsNull Or Row.DxCode1.Trim().Length = 0) Then
            Row.IsSkipped = True
            Row.ErrorDesc = Var("User::strDxCode1EmptyMsg").Value.ToString()
            Return
        End If
        'User::strAllowedAmountEmptyMsg - AllowedAmount is empty ! 
        If (Row.AllowedAmount_IsNull) Then
            Row.IsSkipped = True
            Row.ErrorDesc = Var("User::strAllowedAmountEmptyMsg").Value.ToString()
            Return
        End If


        'Placeofservice value more than 2 digits! 
        If Row.PlaceofService.ToString().Length > 2 Then
            Row.IsSkipped = True
            Row.ErrorDesc = "Placeofservice value more than 2 digits!"
            Return
        End If

        'MemberAmount is empty ! 
        If (Row.MemberAmount_IsNull) Then
            Row.MemberAmount = 0
        End If

        'User::strPaidAmountEmptyMsg - PaidAmount is empty ! 
        If (Row.PaidAmount_IsNull) Then
            Row.IsSkipped = True
            Row.ErrorDesc = Var("User::strPaidAmountEmptyMsg").Value.ToString()
            Return
        End If
        'User::strPaidDateEmptyMsg - PaidDate is empty !
        If (Row.PaidDate_IsNull Or Row.PaidDate.Trim().Length = 0) Then
            Row.IsSkipped = True
            Row.ErrorDesc = Var("User::strPaidDateEmptyMsg").Value.ToString()
            Return
        End If

        'strPaidDateEmptyMSg - Invalid PaidDate ! 
        Dim PaidDate1 As Match = Regex.Match(Row.PaidDate, "^([1][012]|[0]?[1-9])[/]([3][01]|[12]\d|[0]?[1-9])[/]([1-8][0-9][0-9][0-9]|9000)$")
        'Dim ServiceToDate1 As Match = Regex.Match(Row.ServiceToDate, "^(([1-9])|(0[1-9])|(1[0-2]))\/(([0-9])|([0-2][0-9])|(3[0-1]))\/(([0-9][0-9])|([1-9][0,9][0-9][0-9]))$")
        If Not PaidDate1.Success Then
            Row.IsSkipped = True
            Row.ErrorDesc = "Invalid PaidDate"
            Return
        End If

        'User::strFacilityIDEmptyMsg - FacilityID is empty !
        If (Row.FacilityID_IsNull Or Row.FacilityID.Trim().Length = 0) Then
            Row.IsSkipped = True
            Row.ErrorDesc = Var("User::strFacilityIDEmptyMsg").Value.ToString()
            Return
        End If

        'User::strServiceTypeEmptyMsg- ServiceType is empty !
        If (Row.ServiceType_IsNull Or Row.ServiceType.Trim().Length = 0) Then
            Row.IsSkipped = True
            Row.ErrorDesc = Var("User::strServiceTypeEmptyMsg").Value.ToString()
            Return
        End If


        'Invalid service Type!
        If (Row.ServiceType.Trim().ToUpper <> "IPS" And Row.ServiceType.Trim().ToUpper <> "IPA" And Row.ServiceType.Trim().ToUpper <> "OPM" And Row.ServiceType.Trim().ToUpper <> "OPS" And Row.ServiceType.Trim().ToUpper <> "ER" And Row.ServiceType.Trim().ToUpper <> "EM" And Row.ServiceType.Trim().ToUpper <> "ANC") Then
            Row.IsSkipped = True
            Row.ErrorDesc = "Invalid Service Type!"
            Return
        End If

        'In case of any char or special char in integer/money/numeric  field, importer must skip those records.
        If (Not IsNumeric(Row.AllowedAmount)) Then
            Row.IsSkipped = True
            Row.ErrorDesc = "Invalid char/speceial char is in Allowed Amount"
            Return
        End If
        'In case of any char or special char in integer/money/numeric  field, importer must skip those records.
        If (Not IsNumeric(Row.PaidAmount)) Then
            Row.IsSkipped = True
            Row.ErrorDesc = "Invalid char/speceial char is in Paid Amount"
            Return
        End If


        'In case of any char or special char in integer/money/numeric  field, importer must skip those records.
        If (Not IsNumeric(Row.MemberAmount)) Then
            Row.IsSkipped = True
            Row.ErrorDesc = "Invalid char/speceial char is in Member Amount"
            Return
        End If

        'User::strServiceFromDateInvalidMsg - ServiceFromDate is Invalid Format !
        If (Not IsDate(Row.ServiceFromDate)) Then
            Row.IsSkipped = True
            Row.ErrorDesc = Var("User::strServiceFromDateInvalidMsg").Value.ToString()
            Return
        End If

        'User::strPaidDateInvalidMsg - PaidDate is Invalid Format !
        If (Not IsDate(Row.PaidDate)) Then
            Row.IsSkipped = True
            Row.ErrorDesc = Var("User::strPaidDateInvalidMsg").Value.ToString()
            Return
        End If

        'User::strServiceToDateInvalidMsg - ServiceToDate is Invalid Format !
        If (Not IsDate(Row.ServiceToDate)) Then
            Row.IsSkipped = True
            Row.ErrorDesc = Var("User::strServiceToDateInvalidMsg").Value.ToString()
            Return
        End If

        'PaidDate greater then default date ! 
        If (Convert.ToDateTime(Row.PaidDate.Trim()) > Convert.ToDateTime("12/31/9000")) Then
            Row.IsSkipped = True
            Row.ErrorDesc = "PaidDate greater than default dates !"
            Return
        End If

        Var.Unlock()
    Catch ex As Exception
        Row.ErrorDesc = ex.Message().ToString()
    End Try
End Sub
4

1 回答 1

2

If条件中的每个Return之前使用 Var.UnLock() 。

于 2012-11-22T13:54:40.437 回答