在VBScript中返回多个属性包

时间:2018-03-26 09:15:50

标签: vbscript scom

我正在尝试从我的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)
    
  3. 在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']
    

2 个答案:

答案 0 :(得分:0)

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

但是,当MoveFirst记录集为空(MoveLastobjRS都为{{1}时,对BOFEOF的调用会产生错误}})。因此,请按以下方式将其命名为

True

资源:MoveFirst, MoveLast, MoveNext, and MovePrevious Methods (ADO)

答案 1 :(得分: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中的Bad / Good状态,如果它没有硬布尔逻辑:

<Expression>
  <SimpleExpression>
    <ValueExpression>
      <XPathQuery Type="Integer">Property[@Name="CountStuff"]</XPathQuery>
    </ValueExpression>
    <Operator>Greater</Operator>
    <ValueExpression>
      <Value Type="Integer">0</Value>
    </ValueExpression>
  </SimpleExpression>
</Expression>