2012-05-04 47 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); 
    } 
}