2016-09-28 62 views
0

我想從我的數據庫表中獲取Image列的值。使用C#實體框架從SQL數據庫獲取圖像類型

我以前使用過這個代碼,但現在我想調用一個函數從另一個表中查詢它。

MemoryStream ms = new MemoryStream(obj.photo, 0, obj.photo.Length); 
ms.Position = 0; // this is important   
pbFarmer.Image = Image.FromStream(ms, true); 

此代碼拋出一個錯誤:

Cannot implicitly convert type 'System.Linq.IQueryable' to 'System.Drawing.Image'. An explicit conversion exists

public Image getphoto(int id) 
{ 
    using (simisdbEntities db = new simisdbEntities()) 
    { 
     // return db.FarmerImages.Where(u => u.id == id).Select(u => u.photo); 
     // return db.FarmerImages.SqlQuery("SELECT photo FROM dbo.FarmersImages where id =" + id); 

     // return db.FarmerImages.First(a => a.id == id); 

     var img = from p in db.FarmerImages 
        where p.id == id 
        select Image.FromStream(new MemoryStream(p.photo.ToArray())); 
     return img; 
    } 
} 
+0

既然你已經有了這個ID,這個工作嗎? var img = db.FarmerImage.Find(id)。'propertyname'... propertyname將是找到的實體的屬性。 – nocturns2

回答

1

的問題是,你的LINQ查詢返回的IQueryable<Image>而不是單個Image對象,所以你不能從你的方法返回返回它只有一個圖像。你需要以某種方式獲得唯一的價值。

你可以像這樣的東西去:

using (simisdbEntities db = new simisdbEntities()) 
{ 
    IQueryable<Image> img = from p in db.FarmerImages 
          where p.id == id 
          select Image.FromStream(new MemoryStream(p.photo.ToArray())); 
    return img.FirstOrDefault(); 
} 

但後來你會得到一個運行時異常:

Additional information: LINQ to Entities does not recognize the method 'System.Drawing.Image FromStream(System.IO.Stream)' method, and this method cannot be translated into a store expression.

我第一次從數據庫中獲取的FarmerImage元,處理可能的例外 - 例如。不存在圖像 - 然後返回Image對象:

UPDATE: After your comments below, I'd suggest you to also check for the case when you image exists in database, but the photo array is null.

public Image getphoto(int id) 
{ 
    using (var db = new simisdbEntities()) 
    { 
     var imgMetadata = db 
       .FarmerImages 
       .FirstOrDefault(p => p.id == id); 

     //handle the case when image does not exist. 
     if (imgMetadata == null) 
      throw new Exception("Image not found!"); 

     //update: check for the case when a FarmerImage exists in database but the photo array is null 
     if (image.photo == null) 
      throw new Exception("Image not found!"); 

     //read the image bytes into an Image object. 
     var img = Image.FromStream(new MemoryStream(imgMetadata.photo.ToArray())); 

     return img; 
    } 
} 

請記住,你可以調用的方法和處理異常 - 我會做這種方式 - 或者你可以空,而不是返回拋一個異常和處理返回的圖像爲空時的情況。

First case: expecting an exception

public void CallerHanderOrMethod() 
{ 
    try{ 
     var img = farmerManager.getPhoto(farmerId); 
    } 
    catch(Exception ex) //consider throwing a more specific exception. 
    { 
     //load the default silhouette image into the picture box. 
    } 
} 

Second case: expecting a null image.

public void CallerHanderOrMethod() 
{ 
    var img = farmerManager.getPhoto(farmerId); 
    if (img == null) 
    { 
     //load the default silhouette image into the picture box. 
    } 
} 

這應該做的工作。

希望這會有所幫助!

+0

感謝您花時間幫助我。 – ivias

+0

嗨在我用來填寫圖片框之前,如果沒有像這樣的圖像:pbFarmer.Image = Properties.Resources.male_silhouette;如何在getphoto函數中添加如果沒有找到圖像我想顯示這個默認 – ivias

+0

@ivias,很高興幫助!你可以從你的方法返回null,而不是拋出異常,並處理你調用getphoto()的情況,所以如果圖像爲null,你可以加載你的默認輪廓。此外,你應該檢查你的方法,不僅如果圖像不存在,而且如果mage.photo數組爲null。我已經更新了答案。看一看! –

相關問題