2012-05-04 5 views
1

データベースから画像をロードするコードがあり、画像ボックスにそのコードが表示されます。問題は、列にピクチャがない場合、エラーが発生しますが、データベースでNULLを許可するイメージの列としてマークされています。画像の列がnullの可能性があるデータベースから画像をロードする

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'はタイプミスですか、あるいは2つの異なるストリーム(' 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); 
     } 
} 

あなたはDBは、それを扱うが、あなたも(あなたがDbNullに値をキャストすることはできません)、アプリケーションにNULLハンドルん必要があるので、NULL値を受け入れるように列ID DBをマーク:

この

は、トリックを行う必要があります。ヒント

あなたは、使用後にストリームを配置するUsingステートメントを使用する必要がありますStreamのいずれかの種類を使用している間。

+0

?あなたは私にいくつかのコードを教えてくれませんか?答えに – aliprogrammer

+0

コードを追加しました。 –

+0

ありがとうございます。それは働いた – aliprogrammer

1

はちょうどFYI

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); 
    } 
} 
関連する問題