Ошибка EOF и BOF при запросе базы данных SQL

Я пытаюсь запросить базу данных SQL из vbs, но когда запись не найдена, я получаю ошибку

объект adodb.Поле: либо BOF, либо EOF имеет значение True, либо текущая запись была удалена. Запрошенная операция требует текущей записи.

Я думаю, что мне нужно использовать оператор IF NOT для захвата, если запись не найдена, но я не могу понять, куда она должна идти.

Do Until objFile.AtEndofStream
    strAppName = objFile.ReadLine

    ConnString="DRIVER={SQL Server};SERVER=aardvark002;UID=***;PWD=***;DATABASE=DEW_Users"
    SQL = "USE Win7AppData SELECT " & Chr(34) & strCountry & Chr(34) & " FROM AppsByCountry WHERE Application = '" & strAppName & "'"

    Set Connection = CreateObject("ADODB.Connection")
    Set Recordset = CreateObject("ADODB.Recordset")
    Connection.Open ConnString
    Recordset.Open SQL,Connection
    strApproval = Recordset(strCountry)
    If StrApproval = "YES" Then
        strApproval = "Approved"
    Else
        strApproval = "Denied"
    End If
    objExcel.Cells(intRow, 1).Value = strAppname 
    objExcel.Cells(intRow, 2).Value = strCountry
    objExcel.Cells(intRow, 3).Value = strApproval
    intRow = intRow + 1
Loop

3 ответов


немного ржавый на моем VBScript, но вы должны иметь возможность использовать .EOF на наборе записей, чтобы проверить, находится ли он в конце:

Recordset.Open SQL,Connection
If Recordset.EOF = false Then
    ' have some rows, do what you want with them
End If

W3Schools ссылка


У вас может быть еще одна ошибка также в случае, если у вас есть более одной записи в результате, то вам нужно переместить свой recordpointer, если вы не хотите заканчиваться в бесконечном цикле, я также сократил ваш код немного, с другой стороны, вам нужно закрыть соединение, если вы не собираетесь использовать его снова.

ConnString="DRIVER={SQL  Server};SERVER=aardvark002;UID=***;PWD=***;DATABASE=DEW_Users"
Set Connection = CreateObject("ADODB.Connection")
Connection.Open ConnString
Do Until objFile.AtEndofStream
  strAppName = objFile.ReadLine
  SQL = "USE Win7AppData SELECT " & Chr(34) & strCountry & Chr(34) & " FROM AppsByCountry WHERE Application = '" & strAppName & "'"
  Set Recordset = Connection.Execute(SQL)
  Do While not Recordset.EOF 
    strApproval = Recordset(strCountry)
    If StrApproval = "YES" Then
      strApproval = "Approved"
    Else
      strApproval = "Denied"
    End If
    objExcel.Cells(intRow, 1).Value = strAppname 
    objExcel.Cells(intRow, 2).Value = strCountry
    objExcel.Cells(intRow, 3).Value = strApproval
    intRow = intRow + 1
    Recordset.MoveNext
  End If
Loop
Connection.Close
Set Connection = nothing

Я проверял Recodset.EOF и Recordset.BOF чтобы убедиться, что оба ложны, но каждый раз, когда я получал указанную ошибку. Это заняло у меня несколько часов, но я наконец понял, что если вы называете Recordset.Fields.count на EOF и BOF изменено на True.

Я надеюсь, что это может быть полезным.