![](/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.