0

我在 VB.NET 中使用以下代码从 MS ACCESS 数据库中检索具有 OLE OBJECT 类型的图像字段的特定用户图像

                 Dim strSql As String = ""
                'For Image
                strSql = "Select pic from emp_tb WHERE userid='" + textbox1.Text + "'"

                Dim sqlCmd As New OleDbCommand(strSql, con)

                'Get image data from DB
                Dim imageData As Byte() = DirectCast(sqlCmd.ExecuteScalar(), Byte())

                'Initialize image variable 
                Dim newImage As Image = Nothing

                If Not imageData Is Nothing Then
                    'Read image data into a memory stream 
                    Using ms As New MemoryStream(imageData, 0, imageData.Length)
                        ms.Write(imageData, 0, imageData.Length)
                        'Set image variable value using memory stream. 
                        newImage = Image.FromStream(ms, True)

                    End Using

                End If

我将它检索到图片框

picturebox1.image=newImage

我的错误: 在此处输入图像描述

第 300 行是

newImage = Image.FromStream(ms, True)

但是我收到错误消息“参数无效”。请帮助我如何使用参数来避免 sql 注入以及如何解决此错误......

4

3 回答 3

1

RE:尝试加载图像时出现“参数无效”错误

在 Access 中打开数据库文件,然后打开包含要显示的图像的表。

照片.png

  • 如果图像列显示描述Long binary data,则图像已保存为原始二进制数据(有时称为“BLOB”),您应该能够使用现有代码(或非常接近的代码)来填充 PictureBox。

  • 但是,如果图像列显示“位图图像”或“包”之类的描述,则图像已存储为 OLE 嵌入对象。如果您提取原始二进制数据(如您的代码那样)并尝试将其直接转换为图像,您将收到错误,因为二进制数据包含围绕实际图像数据的 OLE“包装器”。(有关更多详细信息,请参阅我的答案。)

关于如何删除 OLE“包装器”并检索原始图像数据已经有很多很多的讨论,但不幸的是 OLE 非常复杂并且(显然)没有特别好的文档记录。在阅读了几十个线程之后,共识似乎是:

  1. 如果您想从 Access 本身存储和检索图像,那么只需让 Access “做它的事情”并为您处理所有 OLE 复杂性。

  2. 如果您将从任何其他应用程序中检索图像,请确保将图像存储为原始二进制数据(即,不要Access 本身中保存图像)。

  3. 试图涵盖上述两种用例可能会很麻烦。最好只坚持一个。

  4. 如果您需要从 Access 数据库中提取 OLE “包装”对象,那么 Stephen Lebans 的OLEtoDisk实用程序可能会非常有用。

RE:使用参数化查询来防止 SQL 注入(和其他令人头疼的问题)

这很容易。只需将您的代码更改为...

strSql = "Select pic from emp_tb WHERE userid=?"

Dim sqlCmd As New OleDbCommand(strSql, con)
sqlCmd.Parameters.AddWithValue("?", textbox1.Text)

'Get image data from DB
Dim imageData As Byte() = DirectCast(sqlCmd.ExecuteScalar(), Byte())
于 2013-06-29T11:03:06.223 回答
0
com.CommandText = "Select * from [Admin_House_Head_Boy] where HouseID=" & HouseID.Text
            Dim dr As OleDbDataReader = com.ExecuteReader()
            dr.Read()
            If dr.HasRows Then
               Dim data As Byte() = DirectCast(dr("Stud_Pic"), Byte())
                Dim ms As New MemoryStream(data)
                PictureBox1.Image = Image.FromStream(ms, True)
            Else
                MsgBox("Record not found")
            End If

please solve this error : "Parameter is not valid."
于 2018-05-22T07:18:13.087 回答
0

在此处输入图像描述

这是我的数据库 ms 访问 2007

于 2018-05-22T07:21:02.657 回答