使用C#创建的映像 – 如何通过SQL将它们插入BLOB中

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

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查询数据库。 我不知道的是中间部分。

  • 什么样的Data Type将用于BLOB列中的INSERT,我的猜测是它将是一个Byte[]

如果是’Byte’,则转换非常简单。

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

以便之后我可以准备我的查询

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

你是正确的,你只需要把它变成一个字节数组。 表的数据类型应为VarBinary(max) 。

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


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

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

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

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


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

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

但是,如果您正在处理大型文件,那么有一些问题,请参阅此SO答案及其链接,以深入了解如何在数据库中存储大型数据对象。