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

WinForm中声明无固定大小数组后如何添加新元素?(已解决)

解决WinForm中SOAP数据数组未指定大小导致的赋值失败问题

你的问题根源是VB.NET中未初始化大小的数组无法直接通过索引赋值元素,而且即使初始化了数组大小,每个元素对应的Event对象也需要先实例化,否则会触发空引用异常。下面提供两种实用的解决方法:

方法一:预查询记录数初始化数组

如果能提前知道需要处理的数据库记录总数,可以先初始化数组的固定大小,再循环赋值:

' 第一步:获取待处理的记录总数
Dim totalRecords As Integer = 0
Using conn As New SqlConnection("你的数据库连接字符串")
    conn.Open()
    Dim countCmd As New SqlCommand("SELECT COUNT(*) FROM 目标表 WHERE 查询条件", conn)
    totalRecords = Convert.ToInt32(countCmd.ExecuteScalar())
End Using

' 第二步:初始化数组大小(VB数组下标从0开始,所以长度设为totalRecords)
ReDim EventArray(totalRecords - 1)
Dim ReportCount As Integer = 0

' 第三步:循环读取数据并赋值
Using conn As New SqlConnection("你的数据库连接字符串")
    conn.Open()
    Dim dataCmd As New SqlCommand("SELECT * FROM 目标表 WHERE 查询条件", conn)
    Using reader As SqlDataReader = dataCmd.ExecuteReader()
        While reader.Read()
            ' 必须先实例化Event对象,否则会空引用
            EventArray(ReportCount) = New GPSmodule.gps.com.module.gps.Event()
            
            ' 为对象属性赋值
            EventArray(ReportCount).plate = reader("Patente").ToString()
            EventArray(ReportCount).Evtcode = reader("Evento").ToString()
            EventArray(ReportCount).date = Convert.ToDateTime(reader("FechaHora"))
            EventArray(ReportCount).latitude = Convert.ToDouble(reader("Latitud"))
            EventArray(ReportCount).longitude = Convert.ToDouble(reader("Longitud"))
            EventArray(ReportCount).speed = Convert.ToDouble(reader("Velocidad"))
            EventArray(ReportCount).temperature = Convert.ToDouble(reader("Sensor1"))
            
            ReportCount += 1
        End While
    End Using
End Using

方法二:使用List动态添加(更推荐)

VB的数组是固定长度的,而List(Of T)支持动态扩容,不需要提前知道记录数,代码更简洁灵活:

' 声明List代替数组,自动处理扩容
Dim eventList As New List(Of GPSmodule.gps.com.module.gps.Event)()

' 循环读取数据库数据
Using conn As New SqlConnection("你的数据库连接字符串")
    conn.Open()
    Dim cmd As New SqlCommand("SELECT * FROM 目标表 WHERE 查询条件", conn)
    Using reader As SqlDataReader = cmd.ExecuteReader()
        While reader.Read()
            ' 创建并初始化Event对象
            Dim currentEvent As New GPSmodule.gps.com.module.gps.Event()
            currentEvent.plate = reader("Patente").ToString()
            currentEvent.Evtcode = reader("Evento").ToString()
            currentEvent.date = Convert.ToDateTime(reader("FechaHora"))
            currentEvent.latitude = Convert.ToDouble(reader("Latitud"))
            currentEvent.longitude = Convert.ToDouble(reader("Longitud"))
            currentEvent.speed = Convert.ToDouble(reader("Velocidad"))
            currentEvent.temperature = Convert.ToDouble(reader("Sensor1"))
            
            ' 添加到List中
            eventList.Add(currentEvent)
        End While
    End Using
End Using

' 若SOAP接口要求数组类型,将List转为数组
EventArray = eventList.ToArray()

关键注意事项

  • 两种方法都必须实例化GPSmodule.gps.com.module.gps.Event对象(即New操作),否则会抛出NullReferenceException
  • 如果查询结果为空,要确保后续SOAP调用能处理空数组/空集合的情况
  • 使用List的方式更适合记录数不确定的场景,避免两次查询数据库(方法一需要先查总数再查数据)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 03:35:40