繁体   English   中英

从Visual Studio C#中的MS Access数据库中获取OLE(位图)对象形式,我的代码有什么问题?

[英]Taking OLE (bitmap) object form MS Access database in Visual studio C# , What's wrong in my code?

我正在尝试从MS Access DB获取图像。 数据已正确提取,但是当我尝试显示一些错误时显示。 我用于显示图像的代码是

            ...
            byte[] photoBytes = (byte[])res[11];
            var ms = new System.IO.MemoryStream(photoBytes);
            image.Image = new System.Drawing.Bitmap(ms);
            ...

错误: 附加信息:参数无效。 在此处输入图片说明

谁能告诉我错误在哪里,或者错误的概率在哪里?

我的功能是

public OleDbDataReader studentInfo(String adm_no)
    {
        OleDbConnection con = new OleDbConnection(ConnStr);
        con.Open();
        OleDbCommand command = new OleDbCommand("SELECT * FROM student_info WHERE adm_no = '"+adm_no+"'", con);
        OleDbDataReader res = command.ExecuteReader();
        return res;
    }

据我所记得,OLE是野兽。 如果您确定知道数据类型是什么,则可以检查一下其二进制结构。 OLE是一个容器,因此IMO绝不仅仅是纯内容。

我没有代码了,但是我记得在不同类型的OLE(Excel,Word,Textfiles,Images ...)的十六进制转储中钓鱼,最终成功率高达80%。 如果是因为我们决定支持的类​​型,或者由于我对OLE的内部结构的了解非常有限,我将无法再说了。

我的调试建议是,在处理二进制数据之前,绝对要确保您具有原始位图数据:

我的方法是创建一个小对象(在本例中为位图),将其存储在DB中,获取它的BLOB并在其中查找已知模式。 我记得我通过逆向工程发现了一些结构(例如搜索对象的字节大小),并且在数据开始时有一定的偏移量。

但是,如果您碰巧知道-甚至更好- 具有 OLE对象的确切结构和实现并能够处理它,我绝对有信心您还将设法将其存储并以位图的形式打开。

祝好运!

此处查看您要尝试执行的操作的示例,尽管该示例是针对JPEG而非位图的。 由于您具有byte[] ,因此需要执行以下操作进行转换:

using (MemoryStream ms = new MemoryStream(photoBytes))
{
  Bitmap img = (Bitmap)Image.FromStream(ms);
}

您的字节流有问题。 通常,我会说在将MemoryStream.Position传递给Bitmap构造函数之前检查是否将其设置为0-如果它位于流的末尾,则可能是有效地传递了一个空流-但这不应该这里不是这样。

构造函数中有一些地方会引发参数异常,但是InvaildParameter应该与所获取的字节流有问题有关。 参见此处: https : //referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Bitmap.cs,cbbb65af7f6fafdb,参考

此处: https//referencesource.microsoft.com/#System.Drawing/commonui/System/Drawing/Advanced/Gdiplus.cs,4edcade52d698713

您应该验证您的字节流是否适合GDI +格式,以便能够作为图像加载-例如,尝试将字节写出到文件中并在Paint中打开它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM