You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Access数据库数组索引填充异常:第4条记录写入数组首索引求助

问题描述

我是编程新手,代码若有混乱之处还请见谅。

我尝试将Access数据库中的数据读取到记录数组中,但发现第4条记录(若使用固定循环而非If语句则为第3条)被写入数组的首个索引。数据字段类型与记录中的类型匹配,数据能正常显示,但顺序异常:先填充第3/4条至第29条记录,之后才填充第1至2/3条记录。

代码示例

Sub GetChoices()
        Dim counter As Integer

        Try
            Dim SQLReader As OleDbDataReader
            Dim connection_type As String = "Provider=Microsoft.ACE.OLEDB.12.0;"
            Dim file_location As String = "Data Source=D:\ADV H CS\TBA Project\TBADATA.accdb"
            Dim conn As OleDbConnection
            conn = New OleDbConnection(connection_type & file_location)
            conn.Open()

            Dim query As String = "SELECT * FROM [TBA DATA]"
            Dim command As New OleDbCommand(query, conn)
            SQLReader = command.ExecuteReader()

            counter = 0
            'Dim condition As Integer = 0 (condition I use for a conditional breakpoint)

            If SQLReader.HasRows Then
                While SQLReader.Read

                    Scenario(counter).Situation = SQLReader("Scenario")
                    Scenario(counter).Option1 = SQLReader("Option1")
                    Scenario(counter).Option2 = SQLReader("Option2")
                    Scenario(counter).PlayerChoice1 = SQLReader("PlayerChoice1")
                    Scenario(counter).PlayerChoice2 = SQLReader("PlayerChoice2")

                    'condition = condition + 1 (condition I use for a conditional breakpoint)

                    If counter < 28 Then
                        counter = counter + 1
                    End If
                End While
            Else
                RichTextBox1.Text = "No Results Returned"
            End If

        Catch ex As Exception

            MsgBox(ex.Message)

        End Try

数据库情况

数据库表[TBA DATA]包含Scenario、Option1、Option2、PlayerChoice1、PlayerChoice2等字段,记录在界面中按连续序号顺序排列。

解决方案

核心问题分析

你遇到的顺序异常,本质是SQL查询未指定明确的排序规则。Access数据库执行SELECT * FROM [TBA DATA]时,返回的记录顺序是基于存储物理顺序或主键索引顺序,和你在数据库界面看到的显示顺序不一定一致。

步骤1:给查询添加排序规则

假设你的表有一个用于标识记录顺序的自增ID字段(比如名为ID),修改SQL语句为:

SELECT * FROM [TBA DATA] ORDER BY ID ASC

如果没有ID字段,也可以用能确定顺序的业务字段排序,比如:

SELECT * FROM [TBA DATA] ORDER BY Scenario ASC

步骤2:优化计数器逻辑

你代码中If counter < 28 Then counter = counter + 1的写法,会导致当counter达到28后,后续读取的所有记录都会覆盖Scenario(28)的值。如果你的数组Scenario长度为29(索引0到28),应该改为同时限制读取条件:

While SQLReader.Read AndAlso counter <= 28
    ' 赋值逻辑
    counter = counter + 1
End While

这样当counter超过数组上限时会自动停止读取,避免覆盖最后一个元素。

修改后的完整代码

Sub GetChoices()
        Dim counter As Integer

        Try
            Dim SQLReader As OleDbDataReader
            Dim connection_type As String = "Provider=Microsoft.ACE.OLEDB.12.0;"
            Dim file_location As String = "Data Source=D:\ADV H CS\TBA Project\TBADATA.accdb"
            Dim conn As OleDbConnection
            conn = New OleDbConnection(connection_type & file_location)
            conn.Open()

            ' 添加ORDER BY指定排序字段,根据你的表实际字段调整
            Dim query As String = "SELECT * FROM [TBA DATA] ORDER BY ID ASC"
            Dim command As New OleDbCommand(query, conn)
            SQLReader = command.ExecuteReader()

            counter = 0

            If SQLReader.HasRows Then
                ' 同时限制计数器不超过数组上限
                While SQLReader.Read AndAlso counter <= 28

                    Scenario(counter).Situation = SQLReader("Scenario")
                    Scenario(counter).Option1 = SQLReader("Option1")
                    Scenario(counter).Option2 = SQLReader("Option2")
                    Scenario(counter).PlayerChoice1 = SQLReader("PlayerChoice1")
                    Scenario(counter).PlayerChoice2 = SQLReader("PlayerChoice2")

                    counter = counter + 1
                End While
            Else
                RichTextBox1.Text = "No Results Returned"
            End If

        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            ' 确保数据库连接关闭,避免资源泄漏
            If conn IsNot Nothing AndAlso conn.State = ConnectionState.Open Then
                conn.Close()
            End If
        End Try

内容的提问来源于stack exchange,提问作者Le7tch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 05:13:12