vbscript - VBS 错误:BOF 或 EOF 为真或当前记录已被删除 错误 800AOBCD
问题描述
由于没有失败记录而失败的代码,具有讽刺意味
我有下面的代码显示 800AOBCD 错误。我做了一段时间的故障排除,发现我做错了什么,但 Notepad++ 中的这种语法现在太多了。
我尝试添加 WHILE NOT rs.EOF 但出错了。我想我已经看这个太久了
还尝试在 EOF 之前执行 LOOP,但也说明了这一点。
'******************************
Function CheckFailures()
'******************************
cmdTxt = "SELECT CAST([DateImported] AS DATE) AS [DateImported],[IsCopied],[IsDeleted],[IsFailed],[FailedReason],[Years],[Scenario],[Version],[Entity],[Account],[AverageBalance],[P01],[P02],[P03],[P04],[P05],[P06],[P07],[P08],[P09],[P10],[P11],[P12] "
cmdTxt = cmdTxt & "FROM essstage.HFM_FACT_PLAN_BSO WHERE ( ISFAILED<>0) AND FAILEDREASON NOT IN('Zero Balance','AverageBalance Not Needed') "
Dim strConnSQL
strConnSQL = "Provider=SQLOLEDB; Server=CHI-SQL16A.dev.LOCAL; Database=GLDMUS_MDEV; Trusted_Connection=Yes"
'Open the connection to the database
Dim cn
Set cn = CreateObject("ADODB.Connection")
cn.Open strConnSQL
'Set the command
Dim cmd
Set cmd = CreateObject("ADODB.Command")
Set cmd.ActiveConnection = cn
'Set the record Set
Dim rs
Set rs = CreateObject("ADODB.recordSet")
'Prepare the query
cmd.CommandText = cmdTxt
cmd.CommandType = 1 'adCmdText
'Execute the query
Set rs = cmd.Execute
Set cmd = Nothing
' First spot I'm trying to check - If the rs returns no records,
' then just say no records returned and don't go interpreting
' the results into a format for email
'Header Row
CheckFailures = "<br><br><br><b> Batch Failures:</b><br><br>"
CheckFailures = CheckFailures & "DateImported" & FillSpaces (12, "DateImported")
CheckFailures = CheckFailures & "IsCopied" & FillSpaces (14, "IsCopied")
CheckFailures = CheckFailures & "IsDeleted" & FillSpaces (12, "IsDeleted")
CheckFailures = CheckFailures & "IsFailed" & FillSpaces (12, "IsFailed")
CheckFailures = CheckFailures & "FailedReason" & FillSpaces (50, "FailedReason")
CheckFailures = CheckFailures & "Years" & FillSpaces (12, "Years")
CheckFailures = CheckFailures & "Scenario" & FillSpaces (12, "Scenario")
CheckFailures = CheckFailures & "Version" & FillSpaces (12, "Version")
CheckFailures = CheckFailures & "Entity" & FillSpaces (12, "Entity")
CheckFailures = CheckFailures & "Account" & FillSpaces (12, "Account")
CheckFailures = CheckFailures & "AverageBalance" & FillSpaces (16, "AverageBalance")
CheckFailures = CheckFailures & "P01" & FillSpaces (10, "P01")
CheckFailures = CheckFailures & "P02" & FillSpaces (10, "P02")
CheckFailures = CheckFailures & "P03" & FillSpaces (10, "P03")
CheckFailures = CheckFailures & "P04" & FillSpaces (10, "P04")
CheckFailures = CheckFailures & "P05" & FillSpaces (10, "P05")
CheckFailures = CheckFailures & "P06" & FillSpaces (10, "P06")
CheckFailures = CheckFailures & "P07" & FillSpaces (10, "P07")
CheckFailures = CheckFailures & "P08" & FillSpaces (10, "P08")
CheckFailures = CheckFailures & "P09" & FillSpaces (10, "P09")
CheckFailures = CheckFailures & "P10" & FillSpaces (10, "P10")
CheckFailures = CheckFailures & "P11" & FillSpaces (10, "P11")
CheckFailures = CheckFailures & "P12" & "<br>"
'Read Query Results
'is this where I put the WHILE NOT rs.EOF to prevent rs.MoveNext?
rs.MoveFirst
Do Until rs.EOF
CheckFailures = CheckFailures & rs.Fields("DateImported").Value & FillSpaces (12, rs.Fields("DateImported").Value)
CheckFailures = CheckFailures & rs.Fields("IsCopied").Value & FillSpaces (14, rs.Fields("IsCopied").Value)
CheckFailures = CheckFailures & rs.Fields("IsDeleted").Value & FillSpaces (12, rs.Fields("IsDeleted").Value)
CheckFailures = CheckFailures & rs.Fields("IsFailed").Value & FillSpaces (20, rs.Fields("IsFailed").Value)
CheckFailures = CheckFailures & rs.Fields("FailedReason").Value & FillSpaces (50, rs.Fields("FailedReason").Value)
CheckFailures = CheckFailures & rs.Fields("Years").Value & FillSpaces (12, rs.Fields("Years").Value)
CheckFailures = CheckFailures & rs.Fields("Scenario").Value & FillSpaces (12, rs.Fields("Scenario").Value)
CheckFailures = CheckFailures & rs.Fields("Version").Value & FillSpaces (12, rs.Fields("Version").Value)
CheckFailures = CheckFailures & rs.Fields("Entity").Value & FillSpaces (12, rs.Fields("Entity").Value)
CheckFailures = CheckFailures & rs.Fields("Account").Value & FillSpaces (12, rs.Fields("Account").Value)
CheckFailures = CheckFailures & rs.Fields("AverageBalance").Value & FillSpaces (16, rs.Fields("AverageBalance").Value)
CheckFailures = CheckFailures & rs.Fields("P01").Value & FillSpaces (10, rs.Fields("P01").Value)
CheckFailures = CheckFailures & rs.Fields("P02").Value & FillSpaces (10, rs.Fields("P02").Value)
CheckFailures = CheckFailures & rs.Fields("P03").Value & FillSpaces (10, rs.Fields("P03").Value)
CheckFailures = CheckFailures & rs.Fields("P04").Value & FillSpaces (10, rs.Fields("P04").Value)
CheckFailures = CheckFailures & rs.Fields("P05").Value & FillSpaces (10, rs.Fields("P05").Value)
CheckFailures = CheckFailures & rs.Fields("P06").Value & FillSpaces (10, rs.Fields("P06").Value)
CheckFailures = CheckFailures & rs.Fields("P07").Value & FillSpaces (10, rs.Fields("P07").Value)
CheckFailures = CheckFailures & rs.Fields("P08").Value & FillSpaces (10, rs.Fields("P08").Value)
CheckFailures = CheckFailures & rs.Fields("P09").Value & FillSpaces (10, rs.Fields("P09").Value)
CheckFailures = CheckFailures & rs.Fields("P10").Value & FillSpaces (10, rs.Fields("P10").Value)
CheckFailures = CheckFailures & rs.Fields("P11").Value & FillSpaces (10, rs.Fields("P11").Value)
CheckFailures = CheckFailures & rs.Fields("P12").Value & "<br>"
'is this where I put the WHILE NOT rs.EOF to prevent rs.MoveNext?
rs.MoveNext
Loop
If Len(CheckFailures) = 0 Then
CheckFailures= "no records returned"
End If
'Close connections
cn.Close
Set cn = Nothing
End Function
解决方案
这不是一个糟糕的尝试,但这是一个返工*,它应该可以帮助您更好地理解流程。有几件事可以从中得到;
- 如果将连接字符串传递到属性中,则无需显式处理,
Set cn = CreateObject("ADODB.Connection")
因为它ADODB.Command
可以处理 a 的创建、打开和关闭。ADODB.Connection
ActiveConnection
- 调用方法时无需显式
Set rs = CreateObject("ADODB.RecordSet")
返回ADODB.Command
a 。ADODB.Recordset
Execute()
- 您可以使用
If
语句来检查是否存在当前记录,方法是同时检查BOF
和EOF
属性设置为False
。
Const adCmdText = 1
'******************************
Function CheckFailures()
'******************************
Dim result, conn, cmd, sql, rs
conn = "Provider=SQLOLEDB; Server=CHI-SQL16A.dev.LOCAL; Database=GLDMUS_MDEV; Trusted_Connection=Yes"
sql = ""
sql = sql & "SELECT CAST([DateImported] AS DATE) AS [DateImported],[IsCopied],[IsDeleted],[IsFailed],[FailedReason]"
sql = sql & ",[Years],[Scenario],[Version],[Entity],[Account],[AverageBalance]"
sql = sql & ",[P01],[P02],[P03],[P04],[P05],[P06],[P07],[P08],[P09],[P10],[P11],[P12] "
sql = sql & "FROM essstage.HFM_FACT_PLAN_BSO "
sql = sql & "WHERE (ISFAILED<>0) AND FAILEDREASON NOT IN('Zero Balance','AverageBalance Not Needed')"
Set cmd = CreateObject("ADODB.Command")
With cmd
.ActiveConnection = conn
.CommandText = cmdTxt
.CommandType = adCmdText
Set rs = .Execute()
End With
Set cmd = Nothing
' First spot I'm trying to check - If the rs returns no records,
' then just say no records returned and don't go interpreting
' the results into a format for email
' Header Row
result = "<br><br><br><b> Batch Failures:</b><br><br>"
result = result & "DateImported" & FillSpaces (12, "DateImported")
result = result & "IsCopied" & FillSpaces (14, "IsCopied")
result = result & "IsDeleted" & FillSpaces (12, "IsDeleted")
result = result & "IsFailed" & FillSpaces (12, "IsFailed")
result = result & "FailedReason" & FillSpaces (50, "FailedReason")
result = result & "Years" & FillSpaces (12, "Years")
result = result & "Scenario" & FillSpaces (12, "Scenario")
result = result & "Version" & FillSpaces (12, "Version")
result = result & "Entity" & FillSpaces (12, "Entity")
result = result & "Account" & FillSpaces (12, "Account")
result = result & "AverageBalance" & FillSpaces (16, "AverageBalance")
result = result & "P01" & FillSpaces (10, "P01")
result = result & "P02" & FillSpaces (10, "P02")
result = result & "P03" & FillSpaces (10, "P03")
result = result & "P04" & FillSpaces (10, "P04")
result = result & "P05" & FillSpaces (10, "P05")
result = result & "P06" & FillSpaces (10, "P06")
result = result & "P07" & FillSpaces (10, "P07")
result = result & "P08" & FillSpaces (10, "P08")
result = result & "P09" & FillSpaces (10, "P09")
result = result & "P10" & FillSpaces (10, "P10")
result = result & "P11" & FillSpaces (10, "P11")
result = result & "P12" & "<br>"
'Read Query Results
If Not (rs.BOF And rs.EOF) Then
While Not rs.EOF
result = result & rs.Fields("DateImported").Value & FillSpaces (12, rs.Fields("DateImported").Value)
result = result & rs.Fields("IsCopied").Value & FillSpaces (14, rs.Fields("IsCopied").Value)
result = result & rs.Fields("IsDeleted").Value & FillSpaces (12, rs.Fields("IsDeleted").Value)
result = result & rs.Fields("IsFailed").Value & FillSpaces (20, rs.Fields("IsFailed").Value)
result = result & rs.Fields("FailedReason").Value & FillSpaces (50, rs.Fields("FailedReason").Value)
result = result & rs.Fields("Years").Value & FillSpaces (12, rs.Fields("Years").Value)
result = result & rs.Fields("Scenario").Value & FillSpaces (12, rs.Fields("Scenario").Value)
result = result & rs.Fields("Version").Value & FillSpaces (12, rs.Fields("Version").Value)
result = result & rs.Fields("Entity").Value & FillSpaces (12, rs.Fields("Entity").Value)
result = result & rs.Fields("Account").Value & FillSpaces (12, rs.Fields("Account").Value)
result = result & rs.Fields("AverageBalance").Value & FillSpaces (16, rs.Fields("AverageBalance").Value)
result = result & rs.Fields("P01").Value & FillSpaces (10, rs.Fields("P01").Value)
result = result & rs.Fields("P02").Value & FillSpaces (10, rs.Fields("P02").Value)
result = result & rs.Fields("P03").Value & FillSpaces (10, rs.Fields("P03").Value)
result = result & rs.Fields("P04").Value & FillSpaces (10, rs.Fields("P04").Value)
result = result & rs.Fields("P05").Value & FillSpaces (10, rs.Fields("P05").Value)
result = result & rs.Fields("P06").Value & FillSpaces (10, rs.Fields("P06").Value)
result = result & rs.Fields("P07").Value & FillSpaces (10, rs.Fields("P07").Value)
result = result & rs.Fields("P08").Value & FillSpaces (10, rs.Fields("P08").Value)
result = result & rs.Fields("P09").Value & FillSpaces (10, rs.Fields("P09").Value)
result = result & rs.Fields("P10").Value & FillSpaces (10, rs.Fields("P10").Value)
result = result & rs.Fields("P11").Value & FillSpaces (10, rs.Fields("P11").Value)
result = result & rs.Fields("P12").Value & "<br>"
rs.MoveNext
Loop
Else
result = "no records returned"
End If
Call rs.Close()
CheckFailures = result
End Function
*提供未经测试的代码。
有用的链接
- VBScript - 返回一个数组中的记录集 (展示如何更进一步并使用
GetRows()
方法将记录集输出到一个数组中,这消除了使用ADODB.Recordset
对象的开销)