我在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)
但我收到错误消息为“Perameter无效”。请帮助我如何使用参数来避免sql注入以及如何解决此错误........
答案 0 :(得分:1)
RE:尝试加载图片时“参数无效”错误
在Access中打开数据库文件,然后打开包含要显示的图像的表格。
如果图像列显示描述Long binary data
,则图像已保存为原始二进制数据(有时称为“BLOB”),您应该能够使用现有代码(或填充PictureBox的一些非常接近它的东西。
但是,如果图像列显示“位图图像”或“包”等描述,则图像已存储为OLE嵌入对象。如果您提取原始二进制数据(如您的代码那样)并尝试将其直接转换为图像,则会收到错误,因为二进制数据包含围绕实际图像数据的OLE“包装器”。 (有关详细信息,请参阅我的回答here。)
关于如何删除OLE“包装器”并检索原始图像数据已经有很多很多讨论,但不幸的是,OLE非常复杂,并且(显然)没有特别详细记录。在阅读了几十个主题后,共识似乎是:
如果您想要从Access内部存储和检索图像 ,那么只需让Access“做其事”并处理所有OLE复杂性你。
如果要从任何其他应用程序 检索图像 ,请确保将图像存储为原始二进制数据(即不从Access本身保存图像。
试图涵盖上述两种使用案例都可能是一件非常麻烦的事。最好只坚持一个。
如果您需要从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())
答案 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)