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
相关产品推荐
相关产品推荐

