WinForm VB.Net迁移Access数据库:查询结果无法显示至文本框报错
问题解决:ADODB.Recordset字段转字符串报错
错误原因
你用rs(7)直接赋值给文本框时,返回的是ADODB.Field对象,不是字段的实际值,因此触发“转换‘Field’类型到‘String’类型无效”的错误。
修复步骤
1. 直接修改字段取值方式
将字段访问改为读取Value属性,同时处理可能的空值(DBNull):
' 替换原赋值语句 If Not rs.EOF AndAlso Not rs(7).Value Is DBNull.Value Then Me.txtProduct.Text = rs(7).Value.ToString() Else Me.txtProduct.Text = "" ' 空值时显示空字符串 End If
2. 优化代码(推荐)
- 使用参数化查询避免SQL注入风险
- 用
Using语句自动释放资源,替代手动置空和关闭 - 采用强类型声明ADODB对象(需添加引用:项目→添加引用→COM→Microsoft ActiveX Data Objects x.x Library)
优化后的完整代码:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim db As String = "C:\Users\Dennis\Documents\Blending & Filling\Basis Olie Lossing\Base Oils.accdb" Dim sql As String = "Select * from [Planning] where [Bestelbon] = ?" ' Using语句自动管理连接和记录集资源 Using con As New ADODB.Connection Using rs As New ADODB.Recordset con.Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & db) ' 参数化查询,防范SQL注入 Dim cmd As New ADODB.Command cmd.ActiveConnection = con cmd.CommandText = sql cmd.Parameters.Append(cmd.CreateParameter("Bestelbon", ADODB.DataTypeEnum.adVarChar, ADODB.ParameterDirectionEnum.adParamInput, 50, Me.txtBestelbon.Text)) rs.Open(cmd) ' 赋值前检查记录是否存在、字段是否为空 If Not rs.EOF AndAlso Not rs.Fields(7).Value Is DBNull.Value Then Me.txtProduct.Text = rs.Fields(7).Value.ToString() Else Me.txtProduct.Text = "" End If End Using con.Close() End Using End Sub
额外说明
- 建议用列名代替索引(比如
rs.Fields("ProductColumnName").Value),代码更易读且不易因表结构变更出错 - 确保
Bestelbon字段类型与文本框值类型匹配,若为数字类型,参数类型需改为adInteger等对应类型
内容的提问来源于stack exchange,提问作者Don Quixote
相关产品推荐
相关产品推荐

