VB窗体开发中如何将SQL单列表查询结果转为数组供条件判断
实现方案:SQL查询结果转VB一维数组及存在性判断
一、查询结果转一维数组
VB窗体程序连接数据库执行查询一般使用ADO组件,不需要逐行手动拼接数组,借助记录集的GetRows方法可以快速拉取结果,再简单调整维度即可得到目标一维数组,示例代码如下:
' 定义数据库连接、记录集、数组变量 Dim conn As ADODB.Connection Dim rs As ADODB.Recordset Dim rawResult As Variant Dim idArray() As Long Dim rowIdx As Long ' 初始化数据库连接,替换为你实际的连接串即可 Set conn = New ADODB.Connection conn.Open "你的数据库连接字符串" Set rs = conn.Execute("SELECT ID FROM PEOPLE") ' 先判断查询结果是否为空,避免运行报错 If Not rs.EOF Then ' GetRows返回二维数组,结构为(列序号, 行序号),仅查ID列时列序号固定为0 rawResult = rs.GetRows(adGetRowsRest) ' 重定义一维数组长度,匹配查询返回的行数 ReDim idArray(UBound(rawResult, 2)) ' 将ID值批量转入一维数组 For rowIdx = 0 To UBound(rawResult, 2) idArray(rowIdx) = rawResult(0, rowIdx) Next Else ' 无查询结果时初始化空数组 ReDim idArray(-1 To -1) End If ' 释放数据库资源 rs.Close conn.Close Set rs = Nothing Set conn = Nothing
执行完成后,idArray就是你需要的形如[101, 19, 33, 50, 6, 9]的一维数组,元素类型和数据库中ID字段的长整型类型匹配。
二、实现数组内存在性判断逻辑
VB没有原生的i in array语法,根据数据量大小选对应实现方式即可:
- 数据量小于1000条:直接遍历判断,无需额外依赖
Dim isMatched As Boolean Dim idVal As Variant isMatched = False ' 遍历数组匹配目标值,找到后立即退出循环减少耗时 For Each idVal In idArray If idVal = i Then ' i为你需要判断的目标变量 isMatched = True Exit For End If Next If isMatched Then ' 此处写入你的Update更新逻辑 End If
- 数据量大于1000条:用Scripting.Dictionary实现O(1)复杂度的匹配,性能远高于遍历
' 晚绑定方式创建字典,无需手动添加引用 Dim idDict As Object Set idDict = CreateObject("Scripting.Dictionary") ' 将数组元素存入字典(可和之前转数组的逻辑合并,减少一次遍历) Dim idVal As Variant For Each idVal In idArray If Not idDict.Exists(idVal) Then idDict.Add idVal, vbNull Next ' 直接判断存在性 If idDict.Exists(i) Then ' 此处写入你的Update更新逻辑 End If Set idDict = Nothing
注意:如果ID字段是字符串类型,将数组定义类型从
Long改为String即可;使用字典匹配时可添加idDict.CompareMode = vbTextCompare配置,避免大小写差异导致匹配失败。
内容的提问来源于stack exchange,提问作者gjfreitas
相关产品推荐
相关产品推荐

