2012-05-04 48 views
1

存在用於從數據庫加載圖像並將其顯示在圖片框中的代碼。問題是如果沒有連續的圖片,它會遇到一個錯誤,但我標記爲允許數據庫中的nulls圖像列。從數據庫加載圖像列圖像,其中圖像列可能爲空

private void button1_Click(object sender, EventArgs e) 
{ 
    sql = new SqlConnection(@"Data Source=PC-PC\PC;Initial Catalog=Test;Integrated Security=True"); 
    cmd = new SqlCommand(); 
    cmd.Connection = sql; 
    cmd.CommandText = ("select Image from Entry where EntryID [email protected]"); 
    cmd.Parameters.AddWithValue("@EntryID", Convert.ToInt32(textBox1.Text)); 
    var da = new SqlDataAdapter(cmd); 
    var ds = new DataSet(); 
    da.Fill(ds, "Images"); 
    int count = ds.Tables["Images"].Rows.Count; 

    if (count > 0) 
    { 
    var data = (Byte[])(ds.Tables["Images"].Rows[count - 1]["Image"]); 
    var stream = new MemoryStream(data); 
    pictureBox1.Image= Image.FromStream(sream); 
    } 
} 
+2

什麼是錯誤? – zimdanen

+0

sream是一個錯字還是你有兩個不同的流('sream'&'var stream ...')? –

+0

無法投射'system.dbnull'類型的對象來鍵入'system.byte []' – aliprogrammer

回答

4

您應該檢查DbNull.Value

這應該做的伎倆:

if (count > 0) 
{ 
     if (ds.Tables["Images"].Rows[count - 1]["Image"] != DbNull.Value){ 
      var data = (Byte[])(ds.Tables["Images"].Rows[count - 1]["Image"]); 
      (MemoryStreamstream = new MemoryStream(data) 
      pictureBox1.Image= Image.FromStream(sream); 
     } 
} 

您標記列ID DB接受空值,所以數據庫處理它,但你還需要在你的應用程序做處理空(你可以不投的DBNull值)。

提示

在使用任何類型的Stream你應該使用Using語句使用後處置流。

+0

怎麼樣?你能給我一些代碼嗎? – aliprogrammer

+0

添加代碼來回答。 –

+0

謝謝。它工作 – aliprogrammer

1

只是檢查

if(ds.Tables["Images"].Rows[count - 1]["Image"]!=DbNull.Value) 
{ 
    //you code of execution 
} 
else 
{ 
    //display default image 
} 
+0

謝謝。它的工作 – aliprogrammer

+0

@aliprogrammer - 比atleast做upvote的答案,如果它適合你... –

+0

我做到了。你看到嗎? – aliprogrammer

2

僅供參考,你需要學會使用using塊。這將確保即使拋出異常也能及時處理對象:

private void button1_Click(object sender, EventArgs e) 
{ 
    var ds = new DataSet(); 
    using (
     var sql = 
      new SqlConnection(
       @"Data Source=PC-PC\PC;Initial Catalog=Test;Integrated Security=True") 
     ) 
    { 
     using (
      var cmd = new SqlCommand 
          { 
           Connection = sql, 
           CommandText = 
            "select Image from Entry where EntryID = @EntryID" 
          }) 
     { 
      cmd.Parameters.AddWithValue(
       "@EntryID", 
       Convert.ToInt32(textBox1.Text)); 
      using (var da = new SqlDataAdapter(cmd)) 
      { 
       da.Fill(ds, "Images"); 
      } 
     } 
    } 

    var imagesTable = ds.Tables["Images"]; 
    var imagesRows = imagesTable.Rows; 
    var count = imagesRows.Count; 

    if (count <= 0) 
     return; 
    var imageColumnValue = 
     imagesRows[count - 1]["Image"]; 
    if (imageColumnValue == DBNull.Value) 
     return; 

    var data = (Byte[]) imageColumnValue; 
    using (var stream = new MemoryStream(data)) 
    { 
     pictureBox1.Image = Image.FromStream(stream); 
    } 
}