VB.NET中数据库查询结果无法存入List列表问题求助
核心问题定位
你的代码拿不到数据是几个明确的逻辑错误导致的,和放在Page_Load里没有直接关系:
- 最致命的逻辑错误:你通过
SqlDataReader执行了查询,但从未将查询结果填充到你代码里用的dtETypeDataTable对象。你在While sdrEType.Read循环里,遍历的是完全空的dtEType,这个对象的Rows.Count永远是0,内部的For循环根本不会执行,自然不会有数据加入listEType。 - 异常处理逻辑失效:你在Catch块里先写了
Throw ex,后面给lblSKUDescription赋值的代码永远不会执行,真出了连接错误、参数错误你完全看不到提示,只会觉得没返回数据。另外Throw ex会重置异常堆栈,真要抛异常直接写Throw就行。 - 隐性风险:你用
AddWithValue传参,运行时会自动推断参数类型,如果推断的类型和数据库字段类型不匹配(比如数据库里AccountNumber是varchar你传了整数,或者长度不匹配),会导致查询条件命中不到索引、甚至查不到结果。另外你手动写了connEType.Close()完全多余,Using块会自动释放连接资源。
修复后代码
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load ' 如果不需要回发时重新绑定数据,加这个判断避免值被覆盖 If Not IsPostBack Then Try Dim sb As New StringBuilder With sb .Append("SELECT TypeID FROM EnrollmentType AS a ") .Append("INNER JOIN Enrollment AS e ON a.TypeDescription = e.EnrollmentType ") .Append("WHERE AccountNumber = @AccountNumber") End With ' 提前初始化用到的对象 listEType = New List(Of Object)() dtEType = New DataTable() Using connEType As New SqlConnection(ConfigurationManager.ConnectionStrings("Blah").ConnectionString) Using cmdEType As New SqlCommand(sb.ToString, connEType) ' 明确指定参数类型,替换AddWithValue避免类型匹配问题 cmdEType.Parameters.Add("@AccountNumber", SqlDbType.VarChar, 50).Value = strgAccountNum.Trim() connEType.Open() Using sdrEType As SqlDataReader = cmdEType.ExecuteReader ' 直接把查询结果加载到DataTable,不用手写Read循环 dtEType.Load(sdrEType) ' 遍历结果填充List For Each row As DataRow In dtEType.Rows listEType.Add(row("TypeID")) Next End Using End Using End Using ' 数值转字符串再给Text属性赋值 lblSKUDescription.Text = dtEType.Rows.Count.ToString() Catch ex As Exception ' 先输出错误信息方便排查,不要先抛异常 lblSKUDescription.Text = $"执行错误:{ex.Message}" ' 调试完成后需要抛异常再打开下面这行,不要写Throw ex ' Throw End Try End If End Sub
后续排查指引
如果替换代码后还是拿不到数据,按顺序核对:
- 先看页面上label输出的错误信息,先排除连接失败、字段名拼写错误、数据库权限不足这类基础问题。
- 核对运行时
strgAccountNum的实际值,和你在SSMS里测试用的参数值完全一致,注意有没有多余的前后空格、特殊字符,两个关联表的TypeDescription/EnrollmentType字段如果是区分大小写的排序规则,值不一致会导致Join失败返回空。 - 确认你代码里连接字符串对应的数据库实例,和你SSMS跑查询用的是同一个,别搞混测试/生产环境。
- 你提到的同页面其他数据库连接代码,只要没有共用同一个未释放的连接、没有重名变量赋值冲突,就不会影响这段逻辑。
内容的提问来源于stack exchange,提问作者WhiteGlint
相关产品推荐
相关产品推荐

