2012-04-19 3 views
6

Sto cercando di interrogare un database SQL da VBS, ma se non si trova alcuna traccia ottengo un erroreerrore EOF e BOF, quando l'esecuzione di query di database SQL

ADODB.Field: BOF o EOF è vero, o il record corrente è stato cancellato. L'operazione richiesta richiede un record corrente.

Penso di aver bisogno di usare un'istruzione IF NOT per catturare se il record non viene trovato ma non riesco a capire dove deve andare.

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 

risposta

5

po 'arrugginito sul mio VBScript, ma si dovrebbe essere in grado di utilizzare .EOF sul Recordset per verificare se è alla fine:

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

W3Schools reference

+0

+1 Quando si utilizza ADODB, il riferimento .EOF è sufficiente, è sufficiente combinare .BOF e .EOF quando si lavora con DAO in MS Access, ad esempio. –

0

Si potrebbe avere un altro bug anche nel caso in cui tu abbia più di un record come risultato, quindi devi spostare il tuo recordpointer se non vuoi finire in un ciclo infinito, ho anche accorciato un po 'il tuo codice, d'altra parte devi chiudere il tuo conn se non hai intenzione di usarlo di nuovo.

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 
0

stavo controllando la Recodset.EOF e Recordset.BOF per assicurarsi che entrambi sono falsi, ma ogni volta che stavo ricevendo l'errore indicato. Mi ci sono volute alcune ore, ma alla fine ho capito che se chiami lo Recordset.Fields.count lo EOF e lo BOF sono cambiati in True.

Spero che questo possa essere utile.