检查varbinary类型不是null并下载它

时间:2014-04-28 10:02:10

标签: c# sql-server winforms

我创建了一个表,其中有一列varbinary(max)类用于存储文件。 我想要做的是,如果该列不为null,我想显示一个pictureBox,并且我已经编写了这段代码:

private void ViewSentMailDet_Load(object sender, EventArgs e)
{
    picturebox.Visible = false;
    string con_string = @"Data Source=(local);Initial Catalog=fyp;Integrated Security=true";
    SqlConnection con = new SqlConnection(con_string);
    string qry = "select file from sentmail where msg_id='"+id of a particular row+"'";
    SqlDataAdapter ad = new SqlDataAdapter(qry, con);
    DataTable dt = new DataTable();
    ad.Fill(dt);
    foreach (DataRow dr in dt.Rows)
    {
        if (dr["file"] != null)
            picturebox.Visible = true;
    }
}

但即使文件列为空,它仍会显示此页面的loadBox上的pictureBox。

此外,当用户点击pictureBox时,我想将此特定文件从表格下载到光盘。

3 个答案:

答案 0 :(得分:1)

if (dr["file"] != DBNull.Value)
{
    picturebox.Visible = true;
}

答案 1 :(得分:0)

要检查列是否包含二进制数据或null,可以使用

    if(!dr.IsNull("attach"))
    {
        attachment.Visible = true;
    }

获取图像字节

  

Byte[] bytes = (Byte[])dr["attach"];

将图像字节转换为图像

Image image = null;
using (var ms = new MemoryStream(bytes))
    image = Image.FromStream(ms);

在图片框上显示图片

  

picturebox.Image = image;

要保存图像,请在picturebox.Click事件处理程序

  

picturebox.Image.Save(@"drive:/path/to/save/image.bmp");


很高兴帮忙!如果您觉得有帮助,请记得接受答案。

答案 2 :(得分:0)

使用任何类型数据库的主要规则之一是永远不会返回您不需要的数据。考虑到这一点,您应该使用查询排除没有图像的行,而不是在事后检查。

所以:

"select file from sentmail where msg_id='"+id of a particular row+"' and file is not null"

而不是:

if (dr["file"] != DBNull.Value)
{
    picturebox.Visible = true;
}

给我们:

private void ViewSentMailDet_Load(object sender, EventArgs e)
{
    picturebox.Visible = false;
    string con_string = @"Data Source=(local);Initial Catalog=fyp;Integrated Security=true";
    SqlConnection con = new SqlConnection(con_string);
    string qry = "select file from sentmail where msg_id='"+id of a particular row+"' and file is not null";
    SqlDataAdapter ad = new SqlDataAdapter(qry, con);
    DataTable dt = new DataTable();
    ad.Fill(dt);
    foreach (DataRow dr in dt.Rows)
    {
        using (var ms = new MemoryStream((byte[])dr["file"])) 
            picturebox.Image = Image.FromStream(ms);
        picturebox.Visible = true;
    }
}