尝试使用 VB.net 从 Access 数据库访问图片文件时,没有为一个或多个必需参数指定值

No value given for one or more required parameters while trying to access a picture file from an Acces database using VB.net

我正在做一个学校项目。我正在测试我的应用程序的登录表单。我正在尝试与我的登录表单和个人资料图片表单分开。我已经成功地将图像保存到访问数据库中,但是我在尝试将其显示在表单的文本框中时遇到了很多问题。

这是整个应用代码:

Imports System.Data.OleDb
Imports System.IO

Public Class Form2

    Dim con As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\geral\source\repos\BD de imagenes\BD de imagenes\DBImagenes.mdb")
    Dim cmd As New OleDbCommand
    Dim sql As String

    Dim da As New OleDb.OleDbDataAdapter
    Dim result As Integer

    Private Sub saveimage(sql As String)
        Try
            Dim arrimage() As Byte
            Dim mstream As New System.IO.MemoryStream
            PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Png)
            arrimage = mstream.GetBuffer()
            Dim Filesize As UInt32
            Filesize = mstream.Length
            mstream.Close()
            con.Open()
            cmd = New OleDbCommand
            With cmd
                .Connection = con
                .CommandText = sql
                .Parameters.AddWithValue("@Imagen", arrimage)
                .Parameters.Add("@Nombre", OleDbType.VarChar).Value = TextBox1.Text
                .ExecuteNonQuery()

            End With
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            con.Close()
        End Try
    End Sub

    'End Try

    Public conex As New OleDbConnection()
    Public Sub conexion()
        conex.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\geral\source\repos\BD de imagenes\BD de imagenes\DBImagenes.mdb"
        conex.Open()
    End Sub
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles BTNGuardar.Click
        sql = "Insert into TBImg (Imagen, Nombre) Values (@Imagen, @Nombre)"
        'sql = "Insert into TBImg (Imagen) Values (@Imagen)"
        saveimage(sql)
        MsgBox("Image has been saved in the database")
    End Sub

    Private Sub BtnExaminar_Click(sender As Object, e As EventArgs) Handles BtnExaminar.Click
        OpenFileDialog1.Filter = "Imagenes JPG|*.jpg|Imagenes PNG|*.png"
        OpenFileDialog1.RestoreDirectory = True
        If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            PictureBox1.Image = Image.FromFile(OpenFileDialog1.FileName)

        End If
    End Sub

    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged

    End Sub

    Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
        Try
            With OpenFileDialog1

                'CHECK THE SELECTED FILE IF IT EXIST OTHERWISE THE DIALOG BOX WILL DISPLAY A WARNING.
                .CheckFileExists = True

                'CHECK THE SELECTED PATH IF IT EXIST OTHERWISE THE DIALOG BOX WILL DISPLAY A WARNING.
                .CheckPathExists = True

                'GET AND SET THE DEFAULT EXTENSION
                .DefaultExt = "jpg"

                'RETURN THE FILE LINKED TO THE LNK FILE
                .DereferenceLinks = True

                'SET THE FILE NAME TO EMPTY 
                .FileName = ""

                'FILTERING THE FILES
                .Filter = "(*.jpg)|*.jpg|(*.png)|*.png|(*.jpg)|*.jpg|All files|*.*"
                'SET THIS FOR ONE FILE SELECTION ONLY.
                .Multiselect = False

                'SET THIS TO PUT THE CURRENT FOLDER BACK TO WHERE IT HAS STARTED.
                .RestoreDirectory = True

                'SET THE TITLE OF THE DIALOG BOX.
                .Title = "Select a file to open"

                'ACCEPT ONLY THE VALID WIN32 FILE NAMES.
                .ValidateNames = True

                If .ShowDialog = DialogResult.OK Then
                    Try
                        PictureBox1.Image = Image.FromFile(OpenFileDialog1.FileName)
                    Catch fileException As Exception
                        Throw fileException
                    End Try
                End If

            End With
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Exclamation, Me.Text)
        End Try

    End Sub

    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        conexion()
        PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
    End Sub

    Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click

    End Sub

    Private Sub BtnBuscar_Click(sender As Object, e As EventArgs) Handles BtnBuscar.Click
        Dim arrimage() As Byte
        Dim conn As New OleDb.OleDbConnection
        Dim Myconnection As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\geral\source\repos\BD de imagenes\BD de imagenes\DBImagenes.mdb"
        conn.ConnectionString = Myconnection
        conn.Open()
        sql = "Select * from TBImg where Nombre=" & (TBBuscar.Text)

        Dim cmd As New OleDbCommand
        With cmd
            .Connection = conex
            .CommandText = sql
        End With
        Dim publictable As New DataTable
        Try
            da.SelectCommand = cmd
            da.Fill(publictable)
            TextBox1.Text = publictable.Rows(1).Item("Nombre").ToString
            arrimage = publictable.Rows(1).Item("Imagen")
            Dim mstream As New System.IO.MemoryStream(arrimage)
            PictureBox1.Image = Image.FromStream(mstream)
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            da.Dispose()
            conn.Close()
        End Try
    End Sub
End Class

相关部分在 Private Sub BtnBuscar_Click

我正在尝试在文本框中搜索我保存图像时使用的名称。但是我没有成功,我得到的只是标题的错误。

这就是我的数据库看起来像将图像保存为 ole object

这是我得到的错误

我正在学习本教程https://www.youtube.com/watch?v=zFdjp39mfhQ

但他没有完全解释如何使用:

TextBox1.Text = publictable.Rows(0).Item(1)
arrimage = publictable.Rows(0).Item(1)'

不知道这是否是问题的原因。

说明。我的代码看起来不同的原因是我试图填充以查看是否可以使它工作。

我试图搜索答案,有人建议我可能把 table 名称或列写错了,但我用 ctrl + 准确复制了名称在 table 中的样子c 和 ctrl + v.

我想要的是,当我在数据库的列名称中键入名称时,它会将存储为 ole object 的指定图片带到我的表单应用程序上我想要的图片框中。

不用说,我对 vb.net 和 SQL、Acces 不是很熟悉。我只是按照教程完成项目。

不要在 class 级别声明连接或命令或数据读取器。他们都需要调用自己的 Dispose 方法。 Using 块将具有声明、关闭和处置,即使出现错误也是如此。流也需要使用块。

OpenFiledialog

的默认值
  1. 多选为假
  2. CheckFileExists 为真
  3. CheckPathExists 为真
  4. DereferenceLinks 为真
  5. ValidateNames 为真
  6. 文件名是“”

除非您通过线路获得报酬,否则无需将这些值重置为默认值。

我已提醒您的过滤器排除 All Files。你也让 jpg 出现了两次。

我声明了一个变量来保存图像文件的文件扩展名 PictureFormat,这样您就可以为 ImageFormat 提供正确的参数。

当您从数据库中检索图像字段时,它以 Object 的形式出现。要获得 Byte()DirectCast 应该可行。

Private PictureFormat As String

Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
    FillPictureBoxFromFile()
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles BTNGuardar.Click
    Try
        saveimage()
    Catch ex As Exception
        MessageBox.Show(ex.Message)
        Exit Sub
    End Try
    MsgBox("Image has been saved in the database")
End Sub

Private cnStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\geral\source\repos\BD de imagenes\BD de imagenes\DBImagenes.mdb"

Private Sub saveimage()
    Dim arrimage() As Byte
    Using mstream As New System.IO.MemoryStream
        If PictureFormat.ToLower = ".png" Then
            PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Png)
        ElseIf PictureFormat.ToLower = ".jpg" Then
            PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Jpeg)
        End If
        arrimage = mstream.GetBuffer()
        Dim Filesize As Long
        Filesize = mstream.Length
    End Using
    Using con As New OleDbConnection(cnStr),
            cmd As New OleDbCommand("Insert into TBImg (Imagen, Nombre) Values (@Imagen, @Nombre)", con)
        With cmd
            .Parameters.Add("@Imagen", OleDbType.Binary).Value = arrimage
            .Parameters.Add("@Nombre", OleDbType.VarChar).Value = TextBox1.Text
            con.Open()
            .ExecuteNonQuery()
        End With
    End Using
End Sub

    Private Sub BtnExaminar_Click(sender As Object, e As EventArgs) Handles BtnExaminar.Click
    FillPictureBoxFromFile()
End Sub

Private Sub BtnBuscar_Click(sender As Object, e As EventArgs) Handles BtnBuscar.Click
    Dim dt As DataTable
    Try
        dt = GetDataByName(TBBuscar.Text)
    Catch ex As Exception
        MessageBox.Show(ex.Message)
        Exit Sub
    End Try
    TextBox1.Text = dt(0)("Nombre").ToString
    Dim arrimage = DirectCast(dt(0)("Imagen"), Byte())
    Dim mstream As New System.IO.MemoryStream(arrimage)
    PictureBox1.Image = Image.FromStream(mstream)
End Sub

Private Function GetDataByName(name As String) As DataTable
    Dim dt As New DataTable
    Using conn As New OleDb.OleDbConnection(cnStr),
            cmd As New OleDbCommand("Select * from TBImg where Nombre= @Buscar", conn)
        cmd.Parameters.Add("@Buscar", OleDbType.VarChar).Value = TBBuscar.Text
        conn.Open()
        Using reader = cmd.ExecuteReader
            dt.Load(reader)
        End Using
    End Using
    Return dt
End Function

Private Sub FillPictureBoxFromFile()
    With OpenFileDialog1
        .Filter = "(*.jpg)|*.jpg|(*.png)|*.png"
        .RestoreDirectory = True
        .Title = "Select a file to open"
        If .ShowDialog = DialogResult.OK Then
            PictureBox1.Image = Image.FromFile(OpenFileDialog1.FileName)
        End If
        PictureFormat = Path.GetExtension(OpenFileDialog1.FileName)
    End With
End Sub