我在阅读SQL图像时遇到问题 结构我的桌子是下一个
CREATE TABLE [dbo].[Nota] (
[Id] [int] IDENTITY(1,1) NOT NULL,
[Titulo] [varchar](50) NOT NULL,
[Imagen] [image] NOT NULL
)
我在DB中保存的字段是下一个
Id Titulo Imagen
1 Nombreimagen 0x53797374656D2E427974655B5D
我的代码是以下
try
{
System.Data.DataSet ds = new System.Data.DataSet();
System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter("SELECT * FROM Nota WHERE ID = '1'", @"Data Source=Server;Initial Catalog=DB;Integrated Security=True;User ID=User;Password=Pasword*");
da.Fill(ds, "Imagen");
byte[] imageBuffer = (byte[])ds.Tables["Imagen"].Rows[0]["Imagen"];
System.IO.MemoryStream ms = new System.IO.MemoryStream(imageBuffer);
pictureBox2.Image = Image.FromStream(ms);
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
我的错误是以下
[System.ArgumentException] = {“参数无效。”}
在下一行
pictureBox2.Image = Image.FromStream(ms);
答案 0 :(得分:1)
尝试使用数据类型 varbinary(max)而不是图像数据类型,不推荐使用图像数据类型。
https://docs.microsoft.com/en-us/sql/t-sql/data-types/ntext-text-and-image-transact-sql
答案 1 :(得分:1)
只要GDI无法从您提供的字节中生成图像,就会出现该错误。
让我们看一下图像区域中的内容:
0x53797374656D2E427974655B5D
如果我通过HexString转换为字节转换器然后ASCII(如果你知道table会有一点帮助)解码结果,例如使用以下代码:
Encoding.ASCII.GetString( StringToByteArray("53797374656D2E427974655B5D")).Dump();
public static byte[] StringToByteArray(String hex)
{
int NumberChars = hex.Length;
byte[] bytes = new byte[NumberChars / 2];
for (int i = 0; i < NumberChars; i += 2)
bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
return bytes;
}
结果是:
System.Byte []
那不是图像。它是您尝试插入或更新该行时保留图像的类型的ToString()方法的结果。当您尝试保存该图像时,可能需要确保图像的SqlParameter将其DbType
属性设置为DbType.Binary
。
您无法在此处显示的代码中解决问题,修复根本原因,修复行中字段Imagen
的内容。