用C#创建的图像-如何通过SQL将它们插入BLOB中

本文关键字:插入 BLOB SQL 何通过 创建 图像 | 更新日期: 2023-09-27 18:25:39

假设我捕获了一个屏幕截图。这是我的代码

int sWidth = 1600, sHeight = 1200;
Bitmap B_M_P = Bitmap(sWidth, sHeight);
Graphics gfx = Graphics.FromImage((Image)B_M_P);
gfx.CopyFromScreen(0, 0, 0, 0, new Size(screenWidth, screenHeight));            
B_M_P.Save("img.jpg", ImageFormat.Jpeg);

我不想把它保存到一个图像中,而是想把它发送到我的SQL或MySQL,并把它们作为BLOB存储在数据库中。

我也知道LINQ来查询DB。我不知道的是中间部分。

  • 什么类型的Data Type将用于在BLOB列中插入,我的猜测它会是Byte[]

如果它是一个"字节",那么转换就很容易了。

ImageConverter imgc = new ImageConverter();
Byte[] temp = (byte[])imgc.ConvertTo(B_M_P,typeof(byte[]));

这样之后我就可以准备我的查询

"INSERT INTO EMPLOYEE (pic) VALUES ('"+temp+"');"
  • 如果不是,则类型是什么&如何转换

用C#创建的图像-如何通过SQL将它们插入BLOB中

您只需要将其转换为字节数组,这是正确的。表的数据类型应为VarBinary(max)。

请注意,有一个Image数据类型,但该数据类型将在未来版本的Microsoft SQL Server中删除,因此Microsoft建议所有人都切换到VarBinary以获得未来的兼容性。


BLOB和VarBinary(max)是一回事。从理解SQL Server 2005 中的VARCHAR(MAX)

为了解决这个问题,微软推出了VARCHAR(MAX),NVARCHAR(MAX)和VARBINARY(MAX)数据类型。这些数据类型可以容纳BLOB可以容纳的相同数量的数据(2GB),并且它们存储在用于其他数据的相同类型的数据页中类型。当MAX数据类型中的数据超过8KB时,溢出页面为习惯于SQL Server 2005自动为页面,并知道如何以相同的方式操作数据行操纵其他数据类型。您可以声明MAX数据的变量存储过程或函数中的类型,甚至将它们作为变量。您也可以在字符串函数中使用它们。

Microsoft建议在SQLServer2005中使用MAX数据类型,而不是BLOB。事实上,BLOB在未来版本的SQL Server。

我在顶部提到的Image数据类型是旧式BLOB数据类型的一个示例。


以下是代码应该如何进行的示例

using(var cmd = SqlCommand("INSERT INTO EMPLOYEE (pic) VALUES (@pic);", connection)
{
    cmd.Parameters.Add("@pic", temp);
    cmd.ExecuteNonQuery();
}

然而,如果您使用的是大文件,也有一些Gotcha,请参阅此SO答案及其链接,以深入了解如何在数据库中存储大数据对象。