2013-10-30 33 views
1

最後,我想從Access數據庫中抓取OLE類型的圖像並將其放入圖片框中。在C#和MS Access 2010中使用Visual Studio 2012.我的解決方案是與應用程序無關的Web。從數據庫檢索圖像時參數無效

所以這是查詢代碼。我正在構建一個對象(Equipamento),其中包含System.Drawing.Image屬性,這是該問題的焦點。

OleDbConnection l = OleDbConnectionDAO.createConnection(); 
Equipamento eq = new Equipamento(); 

try 
{ 
    OleDbDataAdapter adapter = new OleDbDataAdapter(
     "SELECT * FROM [APP_Equipamento_Geral] WHERE COD_ETIQ like '%" 
      + codigo 
      + " %'", 
     l); 
    DataSet ds = new DataSet(); 
    adapter.Fill(ds, "[APP_Equipamento_Geral]"); 
    string s = ds.Tables["[APP_Equipamento_Geral]"].Columns[16].ColumnName; 
    foreach (DataRow row in ds.Tables["[APP_Equipamento_Geral]"].Rows) 
    {     
     eq.NInventario = row["Codigo"].ToString(); 
     eq.Modelo = row["MODELO"].ToString(); 
     eq.Marca = row["Marca_"].ToString(); 
     eq.GamaMedida = row["Gama Medida"].ToString(); 

     if (row["FOTO"] != DBNull.Value && row["FOTO"] != null) 
     { 
      byte[] b = new byte[0]; 
      b = (byte[])row["FOTO"]; 

      eq.Img = getImageFromBytes(b);//Error caught here 
     } 


     //if (row["FOTO"] != DBNull.Value && row["FOTO"] != null) 
     //{ 
     // byte[] b = (byte[])row["FOTO"]; 
     // MemoryStream ms = new MemoryStream(b); 
     // eq.Img = Image.FromStream(ms); //Error caught here 
     //} 
    } 
} 

這裏是輔助方法:

private Image getImageFromBytes(byte[] myByteArray) 
{ 
    System.IO.MemoryStream newImageStream 
     = new System.IO.MemoryStream(myByteArray, 0, myByteArray.Length);\ 

    return Image.FromStream(newImageStream, true); 
} 

這代碼最後評論的作品是我的另一個嘗試也給

無效參數

錯誤。任何解決方案

注:如果我拿出圖像的一部分,一切工作正常。

+0

怎樣的形象進入數據庫?根據它的寫法,它可能不是一個普通的圖像。 –

+0

我不知道它是如何進去的。我只能訪問它所在的桌子,就是這樣。在桌上它說「* Microsoft Word圖片*」,並在結構視圖中顯示「* OLE Object *」 –

回答

0

只能使用轉換才能將圖像或字符串轉換爲arraybite。

如果你想將圖像轉換到arrayBite使用此功能

public byte[] imageToByteArray(System.Drawing.Image imageIn) 
{ 
    MemoryStream ms = new MemoryStream(); 
    imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif); 
    return ms.ToArray(); 
} 

再改arraybite到圖像使用此

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

就像我說的,我想要的是抓住該OLE對象(圖像)並將其分配給變量** eq.img **即* System.Drawing.Image *。 無論哪種方式,嘗試代替** eq.Img = getImageFromBytes(b); **爲** eq.Img = byteArrayToImage(b); **並且仍然有*無效的參數*錯誤。 –

1

存儲爲OLE object的圖像具有從序列化System.Drawing.Image不同的格式。這就是爲什麼我問如何存儲圖像。

雖然我不能擔保這一點,但從來沒有親自使用它,下面的代碼是非常值得推薦的。據推測,它使用MS的GDI + lib(包含在Win標準安裝中)從Access OLE導入/導出圖片。

http://www.access-im-unternehmen.de/index1.php?BeitragID=337&id=300

你可以找到其他的建議(包括實用工具從訪問您的圖片)在此鏈接:

Converting MS Access "OLE Objects" back to plain JPEGs - best way?