2012-05-06 77 views
0

如果我的pictureboxstupic包含圖像,我在我的項目之一中有一個方法,如下所示,該方法返回字節[]。 雖然我想以這樣的方式轉換它,如果pictureboxstupic中沒有圖片,它應該返回string =「NULL」,否則它應該返回bute []。 我該怎麼做?如何創建一個返回條件類型的方法

private byte[] GetPic() 
{ 
    using (var stream = new MemoryStream()) 
    { 
     var bmp = new Bitmap(pictureboxstupic.Image); 
     bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg); 
     stream.Position = 0; 
     var data = new byte[stream.Length]; 
     stream.Read(data, 0, data.Length); 
     return data; 
    } 
} 

注: 在我插入圖像的操作如下

CREATE TABLE [dbo].[Students] 
([Photo] [image] NULL) 

,在我目前的狀況,我將在我的上述列的圖像列,即Students.Photo這樣

if (pictureboxstupic.Image == null) 
{ 
    cmd.Parameters.Add("@Photo", SqlDbType.VarChar).Value = "NULL"; 
} 
else 
{ 
cmd.Parameters.Add("@Photo", SqlDbType.Image).Value = GetPic(); 
} 
+9

爲什麼,爲什麼,你會永遠想要做到這一點? –

回答

3

@ EMPI的答案是正確的,我想它擴大: 方法並且職能應該有一組嚴格定義的職責。在您的GetPic方法的情況下,它將獲取圖像的字節流。這應該是該方法中封裝的邏輯範圍。

在某些錯誤框中顯示單詞「NULL」是而不是GetPic的責任。這是任何人呼叫它的責任,並負責顯示圖像或錯誤信息。這就是爲什麼我認爲GetPic應該只返回null如果它是一個合理的條件不接收圖像,或者如果它是一個真正的錯誤條件,打破了程序流,甚至可能拋出一個異常。

不應在任何情況下做的是返回一個object既可爲byte[]string,因爲這違背了一個強類型的環境整點,是今後引入錯誤的好方法。如果您必須返回byte[]string,您可以按其他人的建議使用ref/out參數,也可以創建一個名爲ImageData的新類或其他類,它包含可用於檢索的字節和錯誤消息任一個或另一個。

- 編輯

經過您的澄清,我仍然堅持我的答案。你不應該這樣做。數據庫支持NULL值,即而不是,與字符串「NULL」相同。您應該確保您的列可以爲空,並插入空值 - DBNull.Value,而不是插入此字符串。您的當前代碼會崩潰,因爲照片列無法處理VarChar值。

+1

是的,您添加的答案是解決此問題的正確方法:該方法返回null,DB代碼保存DBNull.Value。 –

+0

阿夫納兄弟我已經完成了,你問我接受最有幫助的答案。我發現你的答案最有幫助,因爲你不僅告訴我如何解決問題,而且告訴我甚至問題解決了什麼問題。那是我插入字符串「NULL」而不是null或DbNull.Value。但我不明白這是什麼Stream.ToArray ??我如何在編碼中使用它 – kashif

4

您可以隨時返回對象並將其轉換爲您所期望的類型 - 但這不是一個好主意。如果您在調用方法之前檢查pictureboxstupic是否爲空,然後執行正確的邏輯(例如,分配「NULL」),會更好。

您也可以將相似的語義應用於TryParse - 即,如果pictureboxstupic不爲空並且將字節數組作爲out參數返回,您可能會返回bool。

+0

我編輯了我的問題。可能會幫助你幫我 – kashif

1

return object instead?然後通過首先使用is關鍵字檢查類型進行投射。

if(returnedType is string) //or use as and then check for NULL 
{ 

} 
else //type is byte[] 
{ 
} 

不知道關於你的使用情況,以及它是否是有效還是無效,但是這可能是一個解決方案

+0

我已經編輯了我的問題。可能它會幫助你幫我 – kashif

1

可以通過三種解決方案,使其:

1)使用對象作爲回報類型

2.)使用'ref'和'out'參數說明符返回數組,並使方法返回類型字符串返回狀態消息。

3)使用 '不安全' 爲指針代碼...

例子:

public string GetPic(out byte[] ret) 
    { 
     if (Image == null) 
      return "NULL"; 
     //set ret's value as image bytes 
     return "ok"; 
    } 
+0

你可以用我的編碼來回答我嗎。我將如何使用對象作爲返回類型? – kashif

+0

重新收集物體不好。 – user35443

+0

在更新中尋找 – user35443

0

你可以不喜歡它:

 //call the method: 
     string str = ""; //variable that will be changed accordingly by returned value 
     byte[] image = GetPic(); 
     if (image.Length == 0) 
     { 
      //do what ever you want, like string = "NULL": 
      str = "NULL"; 
     } 
    // 
    // 

    private byte[] GetPic() 
    { 
     PictureBox pictureboxstupic = new PictureBox(); 
     using (var stream = new MemoryStream()) 
     { 
      var bmp = new Bitmap(pictureboxstupic.Image); 
      bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg); 
      stream.Position = 0; 
      var data = new byte[stream.Length]; 
      stream.Read(data, 0, data.Length); 
      return data; 
     } 
    } 
-1

我解決我的問題是這樣 方法:

private object GetPic() 
{ 
    if(pictureboxstupic.Image == null) 
    { 
     return null; 
    } 
    using (var stream = new MemoryStream()) 
    { 
     var bmp = new Bitmap(pictureboxstupic.Image); 
     bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg); 
     stream.Position = 0; 
     var data = new byte[stream.Length]; 
     stream.Read(data, 0, data.Length); 
     return data; 

    } 
} 

用法:

cmd.Parameters.Add("@Photo", SqlDbType.Image).Value = GetPic() ?? DBNull.Value; 
+1

只需調用'stream.ToArray()'來簡化代碼,該代碼包裝了整個讀入數組的代碼。此外,您已經設法解決問題很好,但如果您接受幫助您解決問題的答案,我將非常感激。 –

+0

Avner我要求你編輯我的答案的編碼,如你所願。我沒有得到在哪裏使用stream.ToArray()並確定我會接受幫助我解決問題的答案 – kashif

相關問題