如何修复此错误参数无效

时间:2017-11-19 16:55:03

标签: c# sql

我在阅读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);

2 个答案:

答案 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的内容。