使用 c# 从 access 数据库中检索图像

Posted

技术标签:

【中文标题】使用 c# 从 access 数据库中检索图像【英文标题】:retrieve image from access database using c# 【发布时间】:2015-05-05 18:08:23 【问题描述】:

我正在使用以下代码将二进制格式的图像添加到 ms 访问数据库。我存储此图像的数据库中的字段数据类型是OLE Object

reader["Photo"]的值如下

(byte[])reader["Photo"] byte[26]  
byte[] [0]  83 byte [1] 0   byte [2] 121    
byte [3]    0   byte [4]    115 
byte [5]    0   byte [6]    116 
byte [7]    0   byte [8]    101 
byte [9]    0   byte [10]   109 
byte [11]   0   byte [12]   46  
byte [13]   0   byte [14]   66  
byte [15]   0   byte [16]   121 
byte [17]   0   byte [18]   116 
byte [19]   0   byte [20]   101 
byte [21]   0   byte [22]   91  
byte [23]   0   byte [24]   93  
byte [25]   0   byte

    private byte[] imageToByteArray()
    
        //Store the profile image to the database in binary format
        MemoryStream ms = new MemoryStream();
        pbProfilePic.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
        byte[] Pic_arr = new byte[ms.Length];
        ms.Position = 0;
        ms.Read(Pic_arr, 0, Pic_arr.Length);
        return Pic_arr;
    

现在,我正在借助以下代码从数据库中检索这张图片。

        OleDbCommand cmd = new OleDbCommand("select * from Employees where EmpId=" + datarecordId + "", conn);
        OleDbDataReader reader = cmd.ExecuteReader();
        pbProfilePic.Image = byteArrayToImage((byte[])reader["Photo"]);


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

但是,我在Image returnImage = Image.FromStream(ms); 收到以下错误

附加信息:参数无效。

谁能帮我解决这个错误。

谢谢。

我正在使用下面的代码将图像以二进制格式存储到 MS Access 数据库中

    private byte[] imageToByteArray()
    
        //Store the profile image to the database in binary format
        MemoryStream ms = new MemoryStream();
        pbProfilePic.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
        byte[] Pic_arr = new byte[ms.Length];
        ms.Position = 0;
        ms.Read(Pic_arr, 0, Pic_arr.Length);
        return Pic_arr;
    

【问题讨论】:

你用过调试器吗..?当您停在那条线上时,reader["Photo"] 的值是多少..? 检查这个:***.com/questions/2140299/… @MethodMan : reader["Photo"] 的值如下 (byte[])reader["Photo"] byte[26] byte[] [0] 83 byte [1] 0 byte [2] 121 字节 [3] 0 字节 [4] 115 字节 [5] 0 字节 [6] 116 字节 [7] 0 字节 [8] 101 字节 [9] 0 字节 [10] 109 字节 [11] 0 字节[12] 46 字节 [13] 0 字节 [14] 66 字节 [15] 0 字节 [16] 121 字节 [17] 0 字节 [18] 116 字节 [19] 0 字节 [20] 101 字节 [21] 0 字节[22] 91 字节 [23] 0 字节 [24] 93 字节 [25] 0 字节 您显示的字节形成 UTF-16 编码字符串“System.Byte[]”...您将错误的数据保存到数据库的某个地方。显示保存图像的代码。 @CodeCaster,我已经用代码更新了我的问题,我将图像保存到ms access数据库 【参考方案1】:

你可以试试这个:

    public Image byteArrayToImage(byte[] byteArrayIn)
    
        Image retval = null;
        using (MemoryStream stream = new MemoryStream(byteArrayIn))
        
            retval = (Image)new Bitmap(stream);
        
        return retval;
    

另外,正如 methodMan 所说,调试器告诉你什么? byteArrayIn 的值是多少? MemoryStream 是否已正确初始化?

【讨论】:

MemoryStream 已正确初始化,但在读取流时它给我一个错误“参数无效。”【参考方案2】:

如果我只是从一个随机字符串创建一个 byte[] 并使用 byteArrayToImage,我会得到同样的错误。问题是您的原始图像数据不正确。

我尝试在 PictureBox 上使用您的方法(imageToByteArray 和 byteArrayToImage),其中嵌入了 jpg 作为图像,它运行时没有错误,都转换为 byte[],然后转换为 Image。听起来好像有什么东西损坏了图片框中的原始数据。

【讨论】:

以上是关于使用 c# 从 access 数据库中检索图像的主要内容,如果未能解决你的问题,请参考以下文章

从 C# WPF 应用程序中读取 MS Access 数据库中的图像 [重复]

如何使用c#从两个以上的MS Access数据库表中检索数据

使用 C# 从 MS Access DB 中检索表关系

使用 VB.NET 从 Access 中检索长二进制数据(图像)

使用linq mvc c#从数据库中检索图像

如何将日期从 C# 存储到 MS-Access 以及如何检索它?