C# 从图像列可能为空的数据库加载picturebox图像

C# 从图像列可能为空的数据库加载picturebox图像,c#,sql-server,C#,Sql Server,这是从数据库中加载图像并在图片框中显示的代码。问题是,若一行中并没有pic,它将遇到一个错误,但我在数据库中将其标记为allownulls image列 private void button1_Click(object sender, EventArgs e) { sql = new SqlConnection(@"Data Source=PC-PC\PC;Initial Catalog=Test;Integrated Security=True"); cmd = new Sq

这是从数据库中加载图像并在图片框中显示的代码。问题是,若一行中并没有pic,它将遇到一个错误,但我在数据库中将其标记为allownulls image列

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 =@EntryID");
    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);
    } 
}

您应该检查
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标记为接受null值,以便DB处理它,但您也需要在应用程序中处理null(您不能强制转换DbNull值)

提示


当使用任何类型的
流时,您应该使用
using
语句在使用后处理流。

您应该检查
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标记为接受null值,以便DB处理它,但您也需要在应用程序中处理null(您不能强制转换DbNull值)

提示

使用任何类型的
流时
都应该使用
using
语句在使用后处理流。

只需检查即可

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

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

仅供参考,您需要学习使用
块。这将确保及时处理对象,即使引发异常:

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);
    }
}
private void按钮1\u单击(对象发送者,事件参数e)
{
var ds=新数据集();
使用(
var-sql=
新SqlConnection(
@“数据源=PC-PC\PC;初始目录=测试;集成安全性=真”)
)
{
使用(
var cmd=new SqlCommand
{
连接=sql,
命令文本=
“从EntryID=@EntryID的条目中选择图像”
})
{
cmd.Parameters.AddWithValue(
“@EntryID”,
转换为32(textBox1.Text));
使用(var da=new-SqlDataAdapter(cmd))
{
da.填充(ds,“图像”);
}
}
}
var imagesTable=ds.Tables[“Images”];
var imagesRows=imagesTable.Rows;
var count=imagesRows.count;

如果(countFYI),您需要学习使用
块。这将确保及时处理对象,即使引发异常:

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);
    }
}
private void按钮1\u单击(对象发送者,事件参数e)
{
var ds=新数据集();
使用(
var-sql=
新SqlConnection(
@“数据源=PC-PC\PC;初始目录=测试;集成安全性=真”)
)
{
使用(
var cmd=new SqlCommand
{
连接=sql,
命令文本=
“从EntryID=@EntryID的条目中选择图像”
})
{
cmd.Parameters.AddWithValue(
“@EntryID”,
转换为32(textBox1.Text));
使用(var da=new-SqlDataAdapter(cmd))
{
da.填充(ds,“图像”);
}
}
}
var imagesTable=ds.Tables[“Images”];
var imagesRows=imagesTable.Rows;
var count=imagesRows.count;

如果(count是
sream
一个输入错误,或者您有两个不同的流(
sream
&
var-stream…
)?无法将'system.dbnull'类型的对象强制转换为'system.byte[]类型。@aliprogrammer:这个异常是一个很大的提示。
sream
是一个输入错误,还是您有两个不同的流(
sream
&
var stream…
)?无法将“system.dbnull”类型的对象强制转换为“system.byte[]”类型@aliprogrammer:该异常是一个非常大的提示。