VB.NET中的“参数无效”错误从ms访问数据库中将图像反转到图片框

时间:2013-06-27 19:05:04

标签: vb.net ms-access-2007

我在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

我的错误: enter image description here

第300行

newImage = Image.FromStream(ms, True)

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

3 个答案:

答案 0 :(得分:1)

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

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

Photos.png

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

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

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

  1. 如果您想要从Access内部存储和检索图像 ,那么只需让Access“做其事”并处理所有OLE复杂性你。

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

  3. 试图涵盖上述两种使用案例都可能是一件非常麻烦的事。最好只坚持一个。

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

  5. 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())
    

答案 1 :(得分: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."

答案 2 :(得分:0)

enter image description here

这是我的数据库ms access 2007