我已将这些数据存储在 SQL 表中,我需要通过 FileStream 检索它,以将其保存为原来的 png 图片。我只是无法理解或找到一种方法来做到这一点,我阅读了很多建议和示例,但没有一个起作用。有任何想法吗?我只需要一个简单的工作解决方案,所有的理解都可以稍后进行。另外,是否可以使用 OleDb 而不是 Sql 来完成此操作?我存储数据所做的事情是:
Dim connection As New OleDbConnection(MyConnString)
Dim command As New OleDbCommand("UPDATE Prodotti SET Immagine = ? WHERE Oggetto = 'Monitor'", connection)
Using picture As Image = Image.FromFile("C:\Users\user\Desktop\Nuova cartella\galar 1 mainland.png")
Using stream As New MemoryStream
picture.Save(stream, Imaging.ImageFormat.Png)
command.Parameters.Add("@Picture", OleDbType.VarBinary).Value = stream.GetBuffer()
connection.Open()
command.ExecuteNonQuery()
connection.Close()
End Using
End Using
我得到的实际上是 Cell 字段作为一个长字节值。
这里甚至不需要
Image
和 MemoryStream
,因为您只是直接从文件中获取它。直接用FileStream
就可以了。
您还应该传递
-1
作为长度(即 max
值)。
Using
connection As New SqlConnection(MyConnString),
command As New SqlCommand("UPDATE Prodotti SET Immagine = @Picture WHERE Oggetto = 'Monitor'", connection),
stream As FileStream = File.Open("C:\Users\user\Desktop\Nuova cartella\galar 1 mainland.png")
command.Parameters.Add("@Picture", SqlDbType.VarBinary, -1).Value = stream
connection.Open()
command.ExecuteNonQuery()
End Using
使用
SqlCommand
等而不是 OleDb,因为它是为 SQL Server 设计的。
要反向执行相同的操作,请使用阅读器。由于您只有一个值,因此您可以只执行一个
Read
,然后使用 GetStream
Using
connection As New SqlConnection(MyConnString),
command As New SqlCommand("SELECT Immagine FROM Prodotti WHERE Oggetto = 'Monitor'", connection),
filestream As FileStream = File.OpenWrite("C:\Users\user\Desktop\Nuova cartella\galar 1 mainland.png")
connection.Open()
Using reader As SqlDataReader = command.ExecuteReader()
If Not reader.Read() Return
Using stream As Stream = reader.GetStream(0)
stream.CopyTo(fileStream)
End Using
End Using
End Using