![](/img/trans.png)
[英]Accessing data within MS Access database from visual studio C# Code
[英]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.