在VBScript中无法获取SELECT查询多行结果问题求助
解决Aveva Edge中VBScript查询SQL仅返回第一行的问题
问题原因
Aveva Edge(原Indusoft)的$DBExecute函数默认仅返回查询结果的第一行数据,后续行需要通过$DBFetch函数逐行读取,或者通过配置数据库选项实现一次性返回所有行。你尝试的多个单独标签或数组未生效,是因为没有正确处理多行结果的读取逻辑。
解决方案1:使用$DBFetch逐行读取(推荐)
先在Aveva Edge标签库中创建字符串数组标签(例如resultArray),设置数组大小为足够容纳查询结果的行数(比如3个元素,下标0-2),然后通过以下代码实现逐行读取:
Function getColumnNames(tableName) Dim sql, rst, rowCount, i rst = "resultArray" ' 关联已创建的字符串数组标签 sql = "SELECT name FROM sys.columns WHERE object_id = OBJECT_ID('precios') ORDER BY column_id ASC" ' 执行查询,返回结果总行数 rowCount = $DBExecute("sqlExpress", sql, rst) ' 读取并输出所有行 If rowCount > 0 Then ' 第一行已被$DBExecute填充到数组下标0 MsgBox $resultArray(0) ' 循环读取剩余行 For i = 1 To rowCount - 1 $DBFetch("sqlExpress", rst) ' 将下一行数据填充到数组对应下标 MsgBox $resultArray(i) Next End If End Function
解决方案2:设置FetchSize一次性获取所有行
通过$DBOption设置数据库连接的FetchSize为0(表示一次性获取所有结果行),此时$DBExecute会自动将所有行数据填充到数组标签中:
Function getColumnNames(tableName) Dim sql, rst, rowCount rst = "resultArray" ' 关联已创建的字符串数组标签 sql = "SELECT name FROM sys.columns WHERE object_id = OBJECT_ID('precios') ORDER BY column_id ASC" ' 设置一次性获取所有查询结果行 $DBOption("sqlExpress", "FetchSize", 0) ' 执行查询,数组将自动填充所有行数据 rowCount = $DBExecute("sqlExpress", sql, rst) If rowCount > 0 Then MsgBox $resultArray(0) MsgBox $resultArray(1) MsgBox $resultArray(2) End If End Function
关键注意事项
- 必须提前在Aveva Edge标签库中创建对应的数组标签,类型为字符串,数组大小需大于等于查询结果的行数。
- 不要使用多个单独的标签(如
result1/result2/result3),$DBExecute不会自动将多行结果分配到这些独立标签中,数组标签是处理多行结果的标准方式。
内容的提问来源于stack exchange,提问作者user27926789
相关产品推荐
相关产品推荐

