VBScript返回多属性包至SCOM时遇ADODB.Field错误求助
排查VBScript向SCOM属性包添加ADODB.Field值的错误
看起来你在给SCOM传递属性包时踩了两个常见的坑——重复提交属性包和ADODB记录集的访问问题,我帮你一步步拆解排查:
首先,修正属性包的提交逻辑
你的代码里分别在Status分支和Count部分调用了objAPI.AddItem(oBag),这会导致同一个属性包被重复提交,既冗余又可能干扰SCOM的处理逻辑。正确的做法是把两个值都加到同一个属性包里,只提交一次:
' 先创建属性包对象 Set oBag = objAPI.CreatePropertyBag() ' 处理Status判断,添加到属性包 If [你的判断条件] Then oBag.AddValue "Status", "Bad" Else oBag.AddValue "Status", "Good" End If ' 处理SQL查询的Count值,先确保记录集有效 If Not objRS Is Nothing And objRS.State = 1 Then ' 1代表记录集已正常打开 If Not objRS.EOF Then ' 务必取Field的Value属性,而非直接传递Field对象 oBag.AddValue "Count", objRS.Fields("CountStuff").Value Else ' 处理查询无结果的情况,比如设为0标记空结果 oBag.AddValue "Count", 0 End If Else ' 记录集未打开或不存在时的兜底处理 oBag.AddValue "Count", -1 ' 用特殊值标记异常状态 End If ' 只添加一次属性包,然后提交给SCOM objAPI.AddItem oBag objAPI.Submit
然后,排查ADODB.Field错误的核心原因
你遇到的ADODB.Field错误,大概率是以下几个问题之一:
- 字段名不匹配:检查你的SQL查询语句,确认
CountStuff是查询结果的正确别名(比如你是不是写了SELECT COUNT(*) AS CountStuff ...?如果别名写错,比如少了一个字母,就会触发字段不存在的错误)。 - 记录集未正确打开:在访问
objRS.Fields之前,确保你已经成功执行了objRS.Open,而且没有提前调用objRS.Close。可以用WScript.Echo objRS.State输出状态,1表示记录集正常打开。 - 直接传递Field对象而非值:SCOM属性包需要的是具体的数值或字符串,直接传
objRS.Fields("CountStuff")会传递Field对象本身,必须加上.Value来获取实际值。 - 记录集为空:如果SQL查询没有返回任何行,
objRS.EOF会为True,此时访问字段会报错,所以一定要先判断Not objRS.EOF。
调试小技巧
如果还是找不到问题,可以在出错的第41行前后加调试输出,帮你快速定位:
' 输出记录集状态和字段数量 WScript.Echo "Recordset State: " & objRS.State WScript.Echo "Field Count: " & objRS.Fields.Count ' 遍历所有字段名,确认CountStuff存在 For Each fld In objRS.Fields WScript.Echo "Field Name: " & fld.Name Next
内容的提问来源于stack exchange,提问作者edwio
相关产品推荐
相关产品推荐

