VB.NET读取Access数据库OLE图片时报缺少必填参数错误如何解决?
问题根因
你触发的No value given for one or more required parameters错误核心是查询SQL语句语法错误,同时存在多处逻辑不规范问题:
- SQL语句拼接文本类型查询条件时未加单引号,Access会将你输入的Nombre值识别为字段名而非查询参数,触发参数缺失报错
- 代码中同时声明了两个连接对象
conn和conex,连接使用逻辑混乱 - 查询结果取数时用了
Rows(1),DataTable行索引从0开始,会直接触发索引越界错误,且未提前判断是否存在匹配的查询结果 - 存储图片时使用
MemoryStream.GetBuffer()会返回多余的未分配字节,可能导致后续图片加载失败
修复方案
1. 替换BtnBuscar_Click事件的全部代码为以下内容:
Private Sub BtnBuscar_Click(sender As Object, e As EventArgs) Handles BtnBuscar.Click ' 先判断搜索框是否为空 If String.IsNullOrWhiteSpace(TBBuscar.Text) Then MsgBox("请输入要搜索的图片名称") Exit Sub End If Dim arrimage() As Byte ' 统一使用参数化查询,避免SQL注入和语法错误 Dim sql As String = "Select * from TBImg where Nombre = @Nombre" ' 用Using语句自动释放连接、命令、适配器资源,无需手动写释放逻辑 Using conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\geral\source\repos\BD de imagenes\BD de imagenes\DBImagenes.mdb") Using cmd As New OleDbCommand(sql, conn) ' 给查询参数赋值 cmd.Parameters.Add("@Nombre", OleDbType.VarChar).Value = TBBuscar.Text Using da As New OleDbDataAdapter(cmd) Dim publictable As New DataTable Try conn.Open() da.Fill(publictable) ' 先判断是否有匹配的结果 If publictable.Rows.Count = 0 Then MsgBox("未找到对应名称的图片") Exit Sub End If ' 取第一行数据,索引为0 TextBox1.Text = publictable.Rows(0).Item("Nombre").ToString arrimage = publictable.Rows(0).Item("Imagen") Using mstream As New System.IO.MemoryStream(arrimage) PictureBox1.Image = Image.FromStream(mstream) End Using Catch ex As Exception MsgBox(ex.Message) End Try End Using End Using End Using End Sub
2. 可选优化(避免图片加载异常)
修改saveimage方法中内存流读取逻辑:
将arrimage = mstream.GetBuffer()替换为arrimage = mstream.ToArray()
补充说明
publictable.Rows(0).Item("Nombre")是取查询结果集的第一行、字段名为Nombre的字段值,Rows集合的索引从0开始计数,Item可以传入字段名或者字段的顺序索引(比如字段顺序是Imagen在前、Nombre在后,Item(1)就对应Nombre字段)。
内容的提问来源于stack exchange,提问作者THEwed123wet
相关产品推荐
相关产品推荐

