使用 FileStream 从 SQL Server 表中检索 VARBINARY 以将文件保存在 VB.Net 中

问题描述 投票:0回答:1

我已将这些数据存储在 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 字段作为一个长字节值。

sql-server vb.net filestream varbinary
1个回答
0
投票

这里甚至不需要

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
© www.soinside.com 2019 - 2024. All rights reserved.