简体   繁体   English

将二进制图像从数据库显示到gridview中。

[英]Display binary image from database into gridview.

I'm trying to retrieve binary image from database and display it in GridView control. 我正在尝试从数据库检索二进制图像并将其显示在GridView控件中。 A table called [student] in my SQL Server can be displayed inside GridView except for [Image] column. 可以在GridView中显示SQL Server中名为[student]的表,但[Image]列除外。 Here is my c# code trying to retrieve binary image from database: 这是我的C#代码试图从数据库中检索二进制图像:

protected void Page_Load(object sender, EventArgs e)
    {
        string constr = ConfigurationManager.ConnectionStrings["SAOSConnectionString"].ConnectionString;
        using (SqlConnection conn = new SqlConnection(constr))
        {
            using (SqlDataAdapter sda = new SqlDataAdapter("SELECT * FROM student", conn))
            {
                DataTable dt = new DataTable();
                sda.Fill(dt);
                GridView1.DataSource = dt;
                GridView1.DataBind();
            }
        }
    }

    protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            DataRowView dr = (DataRowView)e.Row.DataItem;
            string imageUrl = "data:image/jpg;base64," + Convert.ToBase64String((byte[])dr["Image"]);
            (e.Row.FindControl("Image1") as Image).ImageUrl = imageUrl;
        }
    }

From the code above, I got an error from this line below: It said Unable to cast object of type 'System.DBNull' to type 'System.Byte[]'. 从上面的代码中,我从下面的行中得到了一个错误:它说无法将类型为“ System.DBNull”的对象转换为类型为“ System.Byte []”。

string imageUrl = "data:image/jpg;base64," + Convert.ToBase64String((byte[])dr["Image"]);

As the InvalidCastException message said, it is necessary to put if condition check against DBNull.Value before converting to byte array: 作为InvalidCastException消息说,有必要把if对状态检查DBNull.Value转换为字节阵列之前:

protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        DataRowView dr = (DataRowView)e.Row.DataItem;

        if (dr["Image"] != DBNull.Value)
        {
            var imageControl = e.Row.FindControl("Image1") as Image;

            var encodedImage = Convert.ToBase64String((byte[])dr["Image"]);
            string imageUrl = "data:image/jpg;base64," + encodedImage;
            imageControl.ImageUrl = imageUrl;
        }
    }
}

Alternatively you can use Convert.IsDBNull(dr["Image"]) check which returns true if dr["Image"] contains DBNull.Value . 或者,您可以使用Convert.IsDBNull(dr["Image"])检查,如果dr["Image"]包含DBNull.Value ,则返回true。

i used telerik radGrid. 我用了Telerik radGrid。 Please have a look. 请看一看。 Hopefully you may find a solution 希望你能找到一个解决方案

Grid Column 网格列

<telerik:GridBinaryImageColumn DataField="ImageData" ResizeMode="Fit" 
   ImageHeight="100px"
   HeaderText="Image" AlternateText="No Image" ImageWidth="100px" 
   UniqueName="ImageData">
  <HeaderStyle HorizontalAlign="Left" Width="10%" />
  <ItemStyle HorizontalAlign="Left" Font-Size="15px" />
</telerik:GridBinaryImageColumn>

C# Code C#代码

if (req["ImageData"] != DBNull.Value)
{
   byte[] imageData = (byte[])req["ImageData"];
   string base64String = Convert.ToBase64String(imageData, 0, imageData.Length);
   dtRow["ImageData"] = base64String;
   _item.ImageData = imageData;
   _items.Add(_item);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM