在VB.Net中通过FileStream从SQL Server读取VARBINARY并保存为PNG
解决方案:用OleDb读取SQL Server中的二进制图片并保存为PNG
一、读取并保存图片的代码(VB.NET + OleDb)
直接通过OleDb查询获取存储的二进制数据,再写入文件即可,无需依赖单独的T-SQL脚本:
Dim connection As New OleDbConnection(MyConnString) Dim command As New OleDbCommand("SELECT Immagine FROM Prodotti WHERE Oggetto = 'Monitor'", connection) Try connection.Open() ' 获取存储的二进制图片数据 Dim imageBytes As Byte() = DirectCast(command.ExecuteScalar(), Byte()) If imageBytes IsNot Nothing AndAlso imageBytes.Length > 0 Then ' 直接将字节数组写入文件,生成PNG File.WriteAllBytes("C:\Users\user\Desktop\Nuova cartella\recovered_monitor.png", imageBytes) ' 可选:通过MemoryStream验证图片有效性(避免存储时的无效数据) 'Using ms As New MemoryStream(imageBytes) ' Using img As Image = Image.FromStream(ms) ' img.Save("C:\Users\user\Desktop\Nuova cartella\validated_monitor.png", Imaging.ImageFormat.Png) ' End Using 'End Using End If Finally connection.Close() End Try
二、关键注意事项
- 存储时的遗留问题:你之前用
stream.GetBuffer()获取字节数组,这个方法会返回MemoryStream的整个内部缓冲区(包含未使用的空字节),可能导致存储的字节数组比实际PNG数据长。如果读取后生成的图片无法打开,建议重新存储时改用stream.ToArray()(仅返回实际的图片字节)。 - 字段类型验证:确保
Immagine字段是VARBINARY(MAX)类型,避免因长度限制导致图片数据被截断。
三、关于OleDb替代T-SQL的问题
完全可以用OleDb实现,不需要单独编写T-SQL脚本。OleDb本身就是.NET用于和SQL Server交互的数据提供程序,通过OleDbCommand执行查询、获取结果的过程,本质上就是在执行T-SQL语句,但所有操作都可以通过代码完成,和你存储数据时的逻辑一致,不需要手动在数据库工具中运行T-SQL。
内容的提问来源于stack exchange,提问作者grimoiredark
相关产品推荐
相关产品推荐

