назначить набор записей для базы данных sql с помощью vb6 - PullRequest
0 голосов
/ 27 ноября 2009

HI

Я создал набор записей в vb6 и сохранил значения, которые я прочитал из txt файла. когда я пытаюсь выполнить SQL-запрос, который вставит мои данные набора записей в таблицу данных. Я получаю сообщение об ошибке типа
'' 'либо EOF, либо BOF имеет значение true, или текущий перекод удален. Запрошенная операция требует текущей записи. "" "

Я просто прилагаю свой код, может кто-нибудь, пожалуйста, помогите, где я делаю неправильно. я считаю, что есть ошибка в написании индивидуального имени. Но я не знаю, что это такое.

Любая помощь будет оценена.

Public Function ProcessDNE(ByVal strFileName As String) As Boolean

Dim intFileNbr As Integer
Dim strCurrentLine As String
Dim strRoutingNbr As String
Dim strAcct As String
Dim strIndividualName As String
Dim strAmount As String
Dim curAmount As Currency
Dim strParseString As String
Dim strParseFirstNm As String
Dim strParseMidInit As String
Dim strParseLastNam As String
Dim lngMidInitPos As Long
Dim lngParsePos1 As Long
Dim lngParsePos2 As Long
Dim lngParsePos3 As Long
Dim lngParsePos4 As Long
Dim lngParsePos5 As Long
Dim lngParsePos6 As Long
Dim lngPos As Long

    frmDNELoad.lblStatus.Caption = "Reading File..."
    frmDNELoad.Refresh

    '' # Set up rcdDNE structure
    With rcdDNE.Fields
        .Append "RTN", adVarChar, 9
        .Append "AccountNbr", adVarChar, 17
        .Append "IndividualName", adVarChar, 22
        .Append "FirstName", adVarChar, 50
        .Append "MiddleName", adVarChar, 1
        .Append "LastName", adVarChar, 50
        .Append "Amount", adCurrency
    End With

    rcdDNE.Open
    intFileNbr = FreeFile(1)
    Open strFileName For Input As #intFileNbr Len = 95 '' # Open file for input.
    Do While Not EOF(intFileNbr)
       Line Input #intFileNbr, strCurrentLine
       If Mid(strCurrentLine, 1, 1) = 6 Then
         strRoutingNbr = Mid(strCurrentLine, 4, 8)
         strAcct = Trim(Mid(strCurrentLine, 13, 17))
         strIndividualName = Trim(Mid(strCurrentLine, 55, 22))
         strAmount = Trim(Mid(strCurrentLine, 30, 10))
         strAmount = Left(strAmount, Len(strAmount) - 1)
         curAmount = CCur(strAmount)

       '' # Add new record to temporary recordset
            With rcdDNE
                .AddNew
                .Fields![RTN] = strRoutingNbr
                .Fields![AccountNbr] = strAcct
                .Fields![IndividualName] = strIndividualName
                .Fields![Amount] = curAmount
                .Update
            End With
       End If
    Loop
    Close #intFileNbr

    frmDNELoad.lblStatus.Caption = "Formatting Names..."
    frmDNELoad.Refresh
    DoEvents

    '' # Parse the IndividualName field
    rcdDNE.MoveFirst
    Do Until rcdDNE.EOF
        lngMidInitPos = 0
        lngParsePos1 = 0
        lngParsePos2 = 0
        lngParsePos3 = 0
        lngParsePos4 = 0
        lngParsePos5 = 0
        lngParsePos6 = 0
        strParseString = ""
        strParseFirstNm = ""
        strParseMidInit = ""
        strParseLastNam = ""

        strParseString = Trim(rcdDNE.Fields![IndividualName])
        '' # Replace double spaces ("  ") with a single space (" ")
        lngPos = InStr(1, strParseString, "  ")
        Do While lngPos
            strParseString = Mid(strParseString, 1, lngPos - 1) & Mid(strParseString, lngPos + 1, Len(strParseString))
            lngPos = InStr(1, strParseString, "  ")
        Loop

        '' # Locate positions of remaining spaces
        lngParsePos1 = InStr(1, strParseString, " ")
        If lngParsePos1 = 0 Then
            lngParsePos2 = 0
        Else
            lngParsePos2 = InStr(lngParsePos1 + 1, strParseString, " ")
        End If

        If lngParsePos2 = 0 Then
            lngParsePos3 = 0
        Else
            lngParsePos3 = InStr(lngParsePos2 + 1, strParseString, " ")
        End If
        If lngParsePos3 = 0 Then
            lngParsePos4 = 0
        Else
            lngParsePos4 = InStr(lngParsePos3 + 1, strParseString, " ")
        End If
        If lngParsePos4 = 0 Then
            lngParsePos5 = 0
        Else
            lngParsePos5 = InStr(lngParsePos4 + 1, strParseString, " ")
        End If
        If lngParsePos5 = 0 Then
            lngParsePos6 = 0
        Else
            lngParsePos6 = InStr(lngParsePos5 + 1, strParseString, " ")
        End If

        '' # Determine if Middle initial is present
        If (lngParsePos3 - lngParsePos2) = 2 Then
            lngMidInitPos = lngParsePos2 + 1
            rcdDNE.Fields![MiddleName] = Mid(strParseString, lngMidInitPos, 1)
        ElseIf (lngParsePos4 - lngParsePos3) = 2 Then
            lngMidInitPos = lngParsePos3 + 1
            rcdDNE.Fields![MiddleName] = Mid(strParseString, lngMidInitPos, 1)
        ElseIf (lngParsePos5 - lngParsePos4) = 2 Then
            lngMidInitPos = lngParsePos4 + 1
            rcdDNE.Fields![MiddleName] = Mid(strParseString, lngMidInitPos, 1)
        ElseIf (lngParsePos6 - lngParsePos5) = 2 Then
            lngMidInitPos = lngParsePos5 + 1
            rcdDNE.Fields![MiddleName] = Mid(strParseString, lngMidInitPos, 1)
        ElseIf (lngParsePos2 - lngParsePos1) = 2 Then
            lngMidInitPos = lngParsePos1 + 1
            rcdDNE.Fields![MiddleName] = Mid(strParseString, lngMidInitPos, 1)
        End If

        '' # If there is a middle initial, everything to the left of it goes into the
        '' # first name field, and everything to the right of it goes into the last
        '' # name field. If there is no middle initial, everything after the first space
        '' # goes into the last name field.
        If lngMidInitPos <> 0 Then
            rcdDNE.Fields![FirstName] = Trim(Left(strParseString, lngMidInitPos - 1))
            rcdDNE.Fields![LastName] = Trim(Mid(strParseString, lngMidInitPos + 1, Len(strParseString)))
        Else
            rcdDNE.Fields![FirstName] = Trim(Left(strParseString, lngParsePos1))
            rcdDNE.Fields![LastName] = Trim(Mid(strParseString, lngParsePos1 + 1, Len(strParseString)))
        End If
        rcdDNE.Update
        rcdDNE.MoveNext
    Loop

    '' # Write records to Database

    frmDNELoad.lblStatus.Caption = "Loading data into database......"
    Call FindServerConnection_NoMsg

'' #    Do Until rcdDNE.EOF
'' #   rcdDNE.MoveFirst
'' #    cmdCommand.CommandText = "insert into t_DATA_DneFrc (RTN, AccountNbr, FirstName, MiddleName, LastName, Amount) values ('" & rcdDNE("RTN") & "', '" & rcdDNE("AccountNbr") & "', '" & rcdDNE("FirstName") & "', '" & rcdDNE("MiddleName") & "', '" & rcdDNE("LastName") & "', '" & rcdDNE("Amount") & "')"
'' #    cmdCommand.Execute ()
'' #    rcdDNE.MoveNext
'' #    Loop

    Dim lngRecCount As Long
    lngRecCount = 0

    Set rcdReclamation = New ADODB.Recordset
    With rcdReclamation
        .ActiveConnection = objConn
        .Source = "insert into t_DATA_DneFrc (RTN, AccountNbr, FirstName, MiddleName, LastName, Amount) values ('" & rcdDNE("RTN") & "', '" & rcdDNE("AccountNbr") & "', '" & rcdDNE("FirstName") & "', '" & rcdDNE("MiddleName") & "', '" & rcdDNE("LastName") & "', '" & rcdDNE("Amount") & "')"
        .CursorType = adOpenDynamic
        .CursorLocation = adUseClient
        .LockType = adLockOptimistic
        .Open , , , , adCmdStoredProc
    End With

    rcdDNE.MoveFirst
    Do Until rcdDNE.EOF
        lngRecCount = lngRecCount + 1
        frmDNELoad.lblStatus.Caption = "Adding record " & lngRecCount & " of " & rcdDNE.RecordCount & " to database."
        frmDNELoad.Refresh

        DoEvents
        Call CommitNew
        rcdDNE.MoveNext
    Loop

    frmDNELoad.lblStatus.Caption = "DNE Processing Complete."
    frmDNELoad.Refresh

End Function

1 Ответ

0 голосов
/ 27 ноября 2009

Я предполагаю, что ошибка возникает в 'rcdReclamation.Source = ...', потому что вы получаете доступ к элементам из набора записей rcdDNE при создании запроса. Непосредственно перед настройкой rcdReclamation вы запускали цикл rcdDNE до тех пор, пока он не стал EOF. Поэтому, когда вы создаете запрос, rcdDNE гарантированно возвращает EOF.

Редактировать: возможное решение Прошло немного времени с тех пор, как я использовал наборы записей таким образом (я обычно просто использую запросы и выполняю их в соединении), так что я могу быть немного выключен. Чтобы фактически сохранить все записи в базе данных, вам нужно вызвать UpdateBatch. При использовании AddNew для создания записей и Update для сохранения изменений вам необходимо вызвать UpdateBatch в конце всех операций добавления / редактирования, чтобы зафиксировать изменения в базе данных. Поэтому я бы заменил все от строки «Загрузка данных в базу данных ......» до конца простой rcdDNE.UpdateBatch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...