Member 12429318 Ответов: 1

Как загрузить изображение из базы данных access


У меня есть ошибка, когда я хочу загрузить изображение из access.

Ошибка: "Система.ArgumentException: "параметр недопустим"."

Что я уже пробовал:

Мой код:
Dim RetVal As Long
Dim FieldLen As Int32

Dim AccessConnection As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & Application.StartupPath & "\mochis.mdb;User Id=admin;Password=;")
Dim AccessCommand As New OleDb.OleDbCommand("SELECT image FROM catalogo WHERE codigo = '" & TextBox1.Text & "'", AccessConnection)

AccessConnection.Open()
Dim AccessDataReader As OleDb.OleDbDataReader = AccessCommand.ExecuteReader(CommandBehavior.SequentialAccess)
AccessDataReader.Read()
FieldLen = AccessDataReader.Item(0).Length
Dim PictureByteArray(FieldLen - 1) As Byte
Dim startIndex As Integer = 0
RetVal = AccessDataReader.GetBytes(0, startIndex, PictureByteArray, 0, PictureByteArray.Length)
Dim BLOBDataStream As New MemoryStream(PictureByteArray)
Me.PictureBox1.Image = Image.FromStream(BLOBDataStream)

AccessDataReader.Close()
AccessConnection.Close()

Richard MacCutchan

У вас есть недопустимый параметр где-то в вашем коде, но вы не сказали нам, где именно. Вы также оставляете свой SQL открытым для ошибок SQL-инъекции.

1 Ответов

Рейтинг:
1

Maciej Los

Прежде всего, вы должны использовать параметризованные запросы, а не сцепленные строки, потому что ваш код SQL-инъекция[^] уязвимый

Если бы вы хотели только изображение, я бы сделал это таким образом:

Dim sDbPath As String = Application.StartupPath & "\mochis.mdb"
Dim sConn As String = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Persist Security Info=False;", sDbPath)
Dim ms As MemoryStream = New MemoryStream()
Dim sSql As String = "SELECT image FROM catalogo WHERE codigo=@codigo"
Using oConn As OleDbConnection = New OleDbConnection(sConn)
    oConn.Open()
    Using oComm As OleDbCommand = New OleDbCommand(sSql, oConn)
        oComm.Parameters.Add("@codigo", OleDbType.VarChar).Value = TextBox1.Text;
        Dim imagedata As Byte() = oComm.ExecuteScalar()
        ms.Write(imagedata, 0, imagedata.Length)
        ''load image from stream!
        Me.PictureBox1.Image = Image.FromStream(ms)
        oComm.Dispose()
    End Using
    oConn.Close()
    oConn.Dispose()
End Using


Примечание: чтобы иметь возможность использовать этот код, вы должны установить Драйвер базы данных MS Access 2010[^]

Для получения более подробной информации о подключении, пожалуйста, смотрите: Строки подключения доступа - ConnectionStrings.com[^]

Удачи вам!


Member 12429318

Привет, у меня такая же ошибка: "система.ArgumentException: 'параметр недопустим.'" в этой строке: "Me.PictureBox1.Image = Image.FromStream(МС)"

0x01AA

Привет Мацей
Я не уверен но мне кажется ты забыл что то вроде oComm.Parameters["@codigo"].Value = theCodigoValue; ?
И скорее всего еще и проверить стоит ли ExecuteScalar Возвращать результат...

Maciej Los

Хорошая мысль, Бруно!