【问题标题】:assign recordset to sql database using vb6使用vb6将记录集分配给sql数据库
【发布时间】:2009-11-27 17:14:57
【问题描述】:

我在 vb6 中创建了记录集并存储了从 txt 文件中读取的值。当我尝试执行将我的记录集数据插入数据库表的 SQL 查询时。我收到类似的错误,

EOF 或 BOF 为真,或者当前 recoed 已被删除。请求的操作需要当前记录。

我认为个人名称的措辞有误。但我不知道它是什么。

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

【问题讨论】:

  • VB6 默认应该告诉你错误发生在哪一行——是哪一行?

标签: vb6


【解决方案1】:

我的猜测是rcdReclamation.Source = ... 上发生了错误,因为您在构建查询时正在访问来自rcdDNE 记录集的项目。就在您设置rcdReclamation 之前,您运行了一个rcdDNE 循环,直到它到达EOF。因此,当您创建查询时,rcdDNE 保证返回 EOF。

编辑:可能的解决方案

自从我以这种方式使用记录集以来已经有一段时间了(我通常只使用查询并在连接上执行它们)所以我可能有点偏离。要将所有记录实际保存到数据库中,您需要调用UpdateBatch。当使用AddNew 创建记录并使用Update 保存更改时,您需要在所有添加/编辑结束时调用UpdateBatch 以将更改提交到数据库。所以我会用一个简单的rcdDNE.UpdateBatch 替换从“加载数据到数据库......”行到最后的所有内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 2020-01-01
    • 2019-03-02
    相关资源
    最近更新 更多