【问题标题】:Invalid parameter when retrieving image from DB从数据库中检索图像时参数无效
【发布时间】:2013-11-09 23:34:18
【问题描述】:

最后,我想从 Access 数据库中获取 OLE 类型的图像并将其放入图片框中。在 C# 和 MS Access 2010 中使用 Visual Studio 2012。我的解决方案是与 Web 无关的应用程序。

所以这是查询代码。我正在构建一个对象 (Equipamento),其中包含一个 System.Drawing.Image 属性,这是问题的焦点。

OleDbConnection l = OleDbConnectionDAO.createConnection();
Equipamento eq = new Equipamento();

try
{
    OleDbDataAdapter adapter = new OleDbDataAdapter(
        "SELECT * FROM [APP_Equipamento_Geral] WHERE COD_ETIQ like '%"
           + codigo
           + " %'",
        l);
    DataSet ds = new DataSet();
    adapter.Fill(ds, "[APP_Equipamento_Geral]");
    string s = ds.Tables["[APP_Equipamento_Geral]"].Columns[16].ColumnName;
    foreach (DataRow row in ds.Tables["[APP_Equipamento_Geral]"].Rows)
    {                
        eq.NInventario = row["Codigo"].ToString();
        eq.Modelo = row["MODELO"].ToString();
        eq.Marca = row["Marca_"].ToString();
        eq.GamaMedida = row["Gama Medida"].ToString();

        if (row["FOTO"] != DBNull.Value && row["FOTO"] != null)
        {
            byte[] b = new byte[0];
            b = (byte[])row["FOTO"];

            eq.Img = getImageFromBytes(b);//Error caught here
        } 


        //if (row["FOTO"] != DBNull.Value && row["FOTO"] != null)
        //{
        //    byte[] b = (byte[])row["FOTO"];
        //    MemoryStream ms = new MemoryStream(b);
        //    eq.Img = Image.FromStream(ms);  //Error caught here
        //} 
    }
}

这里是辅助方法:

private Image getImageFromBytes(byte[] myByteArray)
{
    System.IO.MemoryStream newImageStream
        = new System.IO.MemoryStream(myByteArray, 0, myByteArray.Length);\

    return Image.FromStream(newImageStream, true);
}

最后一段注释的代码是我的另一个尝试,它也给出了

参数无效

错误。有什么解决办法吗?

注意:如果我取出图像部分一切正常。

【问题讨论】:

  • 图像如何进入数据库?根据它的编写方式,它可能不是普通的图像。
  • 我不知道它是怎么放进去的。我只能访问它所在的表,仅此而已。在表格上显示“Microsoft Word 图片”,在结构视图中显示“OLE 对象

标签: c# image oledb ms-access-2010


【解决方案1】:

存储为OLE object 的图像与序列化的System.Drawing.Image 具有不同的格式。这就是为什么我问图像是如何存储的。

虽然我不能保证这一点,但我从未亲自使用过它,但强烈推荐使用以下代码。据说,它使用 MS 的 GDI+ 库(包含在 Win 标准安装中)将图片导入/导出到 Access OLE。

http://www.access-im-unternehmen.de/index1.php?BeitragID=337&id=300

您可以在此链接中找到其他建议(包括从 Access 中提取图像的实用程序):

Converting MS Access "OLE Objects" back to plain JPEGs - best way?

【讨论】:

    【解决方案2】:

    您不能仅使用强制转换将图像或字符串转换为 arraybite。

    如果要将图像转换为arrayBite,请使用此函数

    public byte[] imageToByteArray(System.Drawing.Image imageIn)
    {
        MemoryStream ms = new MemoryStream();
        imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
        return ms.ToArray();
    }
    

    要将arraybite重新转换为图像,请使用此

    public Image byteArrayToImage(byte[] byteArrayIn)
    {
        MemoryStream ms = new MemoryStream(byteArrayIn);
        Image returnImage = Image.FromStream(ms);
        return returnImage;
    }
    

    【讨论】:

    • 就像我说的,我想要的是获取那个 OLE 对象(图像)并将它分配给变量 eq.img,它是一个 System.Drawing。图片。无论哪种方式,尝试您的代码替换 eq.Img = getImageFromBytes(b);eq.Img = byteArrayToImage(b); 并且仍然有 Invalid paramter 错误。
    猜你喜欢
    • 2021-12-03
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多