0

我试图从我的 VBScript 返回两个值并将它们存储在单独的属性包中:

  1. 包含If条件的结果

        Call oBag.AddValue("Status","Bad")
        Call objAPI.AddItem(oBag)
    Else
        Call oBag.AddValue("Status","Good")
        Call objAPI.AddItem(oBag)
    
  2. 包含已执行的 SQL 查询的输出

    Call oBag.AddValue("Count",objRS.Fields("CountStuff"))
    Call objAPI.AddItem(oBag)
    

用于传递到 SCOM 旁边。

但是在调试时,我收到以下错误:

(41,1) ADODB.Field:BOF 或 EOF 为 True,或者当前记录已被删除。请求的操作需要当前记录。

这是完整的 VBScript:

Dim objCN, strConnection
Dim objAPI, oBag

Set objCN = CreateObject("ADODB.Connection")
Set objAPI = CreateObject("MOM.ScriptAPI")
Set oBag = objAPI.CreateTypedPropertyBag(2)

strConnection = "Driver={SQL Server};Server=SCOMSRVDB01,2880;Database=DBABee;Trusted_Connection=TRUE"
objCN.Open strConnection

Dim strSQLQuery
strSQLQuery = "Select COUNT (*) as CountStuff from sys.objects"

Dim objRS
Set objRS = CreateObject("ADODB.Recordset")

Set objRS = objCN.Execute(strSQLQuery)

'WScript.Echo (objRS.Fields("CountStuff"))
Call oBag.AddValue("Count", objRS.Fields("CountStuff"))
Call objAPI.AddItem(oBag)

Do Until objRS.EOF
    'WScript.Echo objRS.Fields("CountStuff")
    If objRS.Fields("CountStuff") > 0 Then
        'WScript.Echo "evaluated as bad"
        Call oBag.AddValue("Status","Bad")
        Call objAPI.AddItem(oBag)
    Else
        Call oBag.AddValue("Status","Good")
        Call objAPI.AddItem(oBag)
     End If
     objRS.MoveNext
Loop

Call objAPI.ReturnItems
objRS.Close

'Property[@Name='Status']
4

2 回答 2

0

错误消息似乎很简单。您需要使用该MoveFirst方法将当前记录位置移动到记录集中的第一objRS条记录。

但是,当记录集为空(两者和are )时,调用MoveFirstor 或会MoveLast生成错误。因此,有条件地调用它如下:objRSBOFEOFTrue

''' ''' '''
If Not ( objRS.BOF And objRS.EOF ) Then objRS.MoveFirst

Do Until objRS.EOF
    'WScript.Echo objRS.Fields("CountStuff")
    If objRS.Fields("CountStuff") > 0 Then
        'WScript.Echo "evaluated as bad"
        Call oBag.AddValue("Status","Bad")
        Call objAPI.AddItem(oBag)
    Else
        Call oBag.AddValue("Status","Good")
        Call objAPI.AddItem(oBag)
     End If
     objRS.MoveNext
Loop
''' ''' '''

资源:MoveFirst、MoveLast、MoveNext 和 MovePrevious 方法 (ADO)

于 2018-03-26T19:05:26.057 回答
0

如果您只需要发送一个 PropertyBag DataItem,则不应将其添加到 Collection。

Set oBag = Call objAPI.CreatePropertyBag()
If Not (objRS.BOF And objRS.EOF) Then
  objRS.MoveFirst
  Call oBag.AddValue("CountStuff", objRS.Fields("CountStuff"))
  Call objAPI.Return(oBag)
End If
Call objRS.Close()

如果 System.ExpressionFilter 没有硬布尔逻辑,最好比较坏/好状态:

<Expression>
  <SimpleExpression>
    <ValueExpression>
      <XPathQuery Type="Integer">Property[@Name="CountStuff"]</XPathQuery>
    </ValueExpression>
    <Operator>Greater</Operator>
    <ValueExpression>
      <Value Type="Integer">0</Value>
    </ValueExpression>
  </SimpleExpression>
</Expression>
于 2018-04-03T10:37:58.080 回答