Žádné hodnoty uvedeny pro jeden nebo více požadovaných parametrů při pokusu o přístup k souboru s obrázkem z Acces databáze pomocí VB.net

0

Otázka

Dělám projekt do školy. a zkoušel jsem přihlašovací formulář do aplikace. Snažím odděleně od mé přihlašovací formulář a profil pic formě. Mám úspěšně podařilo uložit obrázek do databáze aplikace access, ale já měl docela dost problémů, které se snaží zobrazit ji na textové pole na formuláři.

To je celý kód aplikace:

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

příslušná část je v Soukromých Sub BtnBuscar_Click. BTNBuscar

Snažím se hledat v textovém poli pro jméno, které jsem zachránil obraz. ale neměl jsem úspěch to je chyba tohoto titulu.

to je, jak moje databáze vypadá to, že snímky jsou ukládány jako objekt ole this is how my database looks like the images are saved as an ole object

To je chyba, jsem si This is the error I get

Byl jsem v návaznosti na tento návod https://www.youtube.com/watch?v=zFdjp39mfhQ

ale on neměl dost vysvětlují, jak používat:

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

nevím, jestli to je příčinou problému.

pokyny. Důvod, proč můj kód vypadá jinak, je, že se snažím věci vidět, jestli bych mohl udělat to fungovat.

Snažil jsem se hledat odpovědi a lidé naznačují, že bych mohl dát název tabulky špatně, nebo sloupec, ale jsem zkopíroval jméno přesně tak, jak to je v tabulce s ctrl + c a ctrl + v.

to, co chci, je, že když jsem zadejte název v název sloupce z databáze, které to přináší určený obrázek uložen jako objekt ole na můj požadovaný obrázek box na formuláři aplikace.

Netřeba dodávat, že nejsem tak zkušený s vb.net a SQL, Přístup. Já jsem jen následující návody jsou schopni dokončit projekt.

data-retrieval image ms-access sql
2021-11-23 04:13:25
1

Nejlepší odpověď

0

Ne prohlašuji, kontakty nebo příkazy nebo datareaders na úrovni třídy. Ti všichni potřebují, aby jejich Likvidaci metody zvané. Using bloky budou mít prohlásit, uzavření a likvidace, i když tam je chyba. Proudy také třeba Pomocí bloků.

Výchozí nastavení pro OpenFiledialog

  1. Multiselect je False
  2. CheckFileExists je Pravda
  3. CheckPathExists je Pravda
  4. DereferenceLinks je Pravda
  5. ValidateNames je Pravda
  6. Názvem je ""

Pokud jste placený od řádku, je nutné obnovit tyto hodnoty na jejich výchozí hodnoty.

Upozornil jsem Filtr vyloučit All Files. Také jste měli jpg objevují dvakrát.

Jsem deklaroval proměnnou držet příponu souboru, PictureFormat, obrázku, souboru, takže vám může poskytnout správný parametr pro ImageFormat.

Když jsi načíst obrázek pole z databáze to přijde jako Object. Získat Byte() a DirectCast měl by fungovat.

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
2021-11-23 06:49:31

na jaké úrovni nebo obor názvů by měl prohlašuji připojení, příkazy, data čtenářů, a proudy? Zatímco se snaží testovat kód, který jste za předpokladu, dostal jsem chybu, že řekl, že příkaz nebude fungovat na tento obor názvů. To nebylo dokud jsem se dostal dovnitř, formulář je třída, že to fungovalo dokonale. I když bych rád věděl, správný přístup. Naučil jsem se teď o Pomocí bloku. výchozí ofd hodnoty a další tipy, které jste mi dal. poté, co jsem udělal s tímto úkolem rád bych se výzkum více o tom v budoucnosti se zdá být velmi zajímavé.
THEwed123wet

@THEwed123wet Připojení, atd. by měl být vyhlášen v metodě, která je Sub nebo Function, kde jsou použity. Tyto objekty používají nespravované prostředky, kód mimo .net framework. K uvolnění těchto zdrojů, které poskytují Dispose metoda. Je důležité, že tato metoda je volána. Pomocí bloků volání Dispose pro vás, i když tam je chyba.
Mary

@THEwed123wet Pokud kód funguje pro vás, prosím, přijměte mou odpověď kliknutím na zatržítko (zatržítkem) vlevo odpověď.
Mary

@THEwed123wet důvod, proč ten kód nebude fungovat mimo třídy Formuláře je, že odkazy, ovládací prvky umístěny na formuláři. Například saveimage metoda odkazuje na pole obrázek a textové pole. Můžete předat hodnoty z formuláře metodou s parametry a argumenty do samostatné třídy. To bude mít přednost, ale nechtěl jsem, aby to bylo složitější, protože jsem nevěděl, vaše úroveň zkušeností.
Mary

To Dává smysl. Díky moc za podrobné vysvětlení! Budu mít vaše tipy na paměti pro příště :)
THEwed123wet

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................