2008-10-20 49 views
3

我一直試圖在C#windows應用程序中的圖片框中讀取保存在Access DB中的圖片作爲OLE對象。從Access DB中將圖片讀入PictureBox

執行此代碼被呈現如下:

Bitmap bmp = new Bitmap(ms) 

從:

 string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Rajesh\SampleDB_2003.mdb;"; 
     OleDbConnection oConn = new OleDbConnection(connString); 
     oConn.Open(); 
     string commandString = "select * from employee where id = " + id + ""; 
     OleDbCommand oCmd = new OleDbCommand(commandString, oConn); 
     OleDbDataReader oReader = oCmd.ExecuteReader(CommandBehavior.SequentialAccess); 

     while (oReader.Read()) 
     { 
      txtID.Text = ((int)oReader.GetValue(0)).ToString(); 
      txtName.Text = (string)oReader.GetValue(1); 
      txtAge.Text = ((int)oReader.GetValue(2)).ToString(); 
      txtType.Text = (string)oReader.GetValue(3); 
      byte[] imageBytes = (byte[])oReader.GetValue(4); 

      MemoryStream ms = new MemoryStream(); 
      ms.Write(imageBytes, 0, imageBytes.Length); 
      Bitmap bmp = new Bitmap(ms); 
      pbPassport.Image = bmp; 
     } 

當我執行上面的代碼中,「參數無效」異常在生產線拋出異常消息,很明顯'ms'的格式不可識別。任何建議要通過這個?

回答

-1

你的字節流已經損壞了,因爲我嘗試了你的確切方法,但是而是用文件中的PNG數據填充字節數組。

我會建議創建兩個流,一個來自數據庫,另一個來自作爲數據庫中圖像源的文件。然後逐字節比較它們。如果甚至有一個字節的差異,則數據庫圖像數據已損壞。

0

不幸的是,我對你沒有好的答案,但我可以告訴你,當我嘗試時,我得到了同樣的結果。有時會跳過字節數組的前78個字節,有時它不會。

這是因爲OLE對象數據類型在字段中存儲某種類型的頭,因此Access知道它是什麼類型的OLE對象。我無法找到一個可靠的方法來確切地確定這個頭部停止和真實數據的起始位置,但我也放棄了,所以祝你好運:)

0

你可以試試:

pbPassport.Image = Image.FromStream(ms); 
1

做谷歌搜索AccessHdr。您將找到對AccessHdr.cpp和AccessHdr.h的引用。這些將說明什麼是需要提取沒有標題的流。

1

您無法輕鬆讀取OLE對象。實際上,將圖片保存爲數據庫中的OLE對象是一種不好的做法。

在某些存儲中,最好將em作爲BLOB對象或路徑和文件名。 AccessImagine可以處理MS Access和C#的兩種情況。你可以在這裏下載 - http://access.bukrek.net