none
Загрузка картинок в GridView из базы данных RRS feed

  • Вопрос

  • Здравствуйте! В базе данных MS SQL храняться картинки в поле varbinary(max). Хочу отобразить их в GridView, но вместо картинок пишет Image.

    Вот мой обработчик для извлечения картинок из базы:

    using System;
    using System.Web;
    using System.Data.SqlClient;
    using System.Configuration;
     
    public class DisplayImageHandler : IHttpHandler {
     
         public void ProcessRequest( HttpContext context )
         {
              SqlConnection con=new SqlConnection();
              con.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
     
              SqlCommand cmd = new SqlCommand();
              cmd.CommandText = "SELECT [Фото] FROM [Серьги]" + "WHERE ID =@ID";
              cmd.CommandType=System.Data.CommandType.Text;
              cmd.Connection=con;
     
              SqlParameter photoID=new SqlParameter("@ID",System.Data.SqlDbType.Int);
     
              photoID.Value=context.Request.QueryString["ID"];
              cmd.Parameters.Add(photoID);
              con.Open();
     
     
              SqlDataReader reader = cmd.ExecuteReader();
              reader.Read();
     
              byte[] buffer = new byte[0];
              
              buffer = (byte[])reader["Фото"];
              context.Response.BinaryWrite( buffer );
     
              reader.Close();
              con.Close();
         }
     
        public bool IsReusable {
            get {
                return false;
            }
        }
     
    }

    А это мой GridView

    <asp:GridView ID="tablicaUkroshenii" runat="server" AutoGenerateColumns="False" 
                       DataKeyNames="Название" DataSourceID="UkrosheniaDataSource">
                       <Columns>
                            <asp:BoundField DataField="Название" HeaderText="Название" ReadOnly="True" 
                                 SortExpression="Название" >
     
                            <ControlStyle Width="50px" />
                            </asp:BoundField>
     
                            <asp:BoundField DataField="Стоимость" HeaderText="Стоимость" 
                                 SortExpression="Стоимость"  >
                                 <ControlStyle Width="50px" />
                            </asp:BoundField>
                                 <asp:TemplateField HeaderText="Фото">
                                 <ItemTemplate>
                                 <asp:Image ID="Image" ImageUrl='<%# "DisplayImageHandler.ashx?ID="+ Eval("ID")%>'
                                      runat="server" />
                                 </ItemTemplate>
                                      <ControlStyle Width="300px" />
                                 </asp:TemplateField>
     
                       </Columns>
                  </asp:GridView>



Ответы

  • предлагаю попробовать следующее :

    файл - ShowImage.ashx - для добавления фото в базу и извлечения фото из базы - правда SQLite - но принцип не сильно отличается

    <%@ WebHandler Language="C#" Class="ShowImage" %>
     
    using System;
    using System.Configuration;
    using System.Web;
    using System.IO;
    using System.Data;
    using System.Data.SqlClient;
    using albomDSTableAdapters;
     
    public class ShowImage : IHttpHandler
    {
        AlbumTableAdapter albDS = new AlbumTableAdapter();
        public void ProcessRequest(HttpContext context)
        {
            Int32 picid;
            if (context.Request.QueryString["id"] != null)
                picid = Convert.ToInt32(context.Request.QueryString["id"]);
            else
                throw new ArgumentException("No parameter specified");
           
            
            
            //Stream fs = ShowAlbumImage(picid);
            //BinaryReader r = new BinaryReader(fs);
           
            //for (int i = 0; i < fs.Length; i++)
            //{
                
            //}
    
            context.Response.ContentType = "image/jpg";
            Stream strm = ShowAlbumImage(picid);
            int _strm = 200000;
            byte[] buffer = new byte[_strm];
            int byteSeq = strm.Read(buffer, 0, _strm);
    
            while (byteSeq > 0)
            {
                context.Response.OutputStream.Write(buffer, 0, byteSeq);
                byteSeq = strm.Read(buffer, 0, _strm);
            }
        }
    
        public Stream ShowAlbumImage(int picid)
        {
            DataView dvIMG = new DataView(albDS.GetData(), "pic_id='" + picid + "'", "pic_id", DataViewRowState.CurrentRows);
            object img = dvIMG[0]["pic"];
            try
            {
                return new MemoryStream((byte[])img);
            }
            catch
            {
                return null;
            }
        }
     
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
     
     
    }


    страница для отображения фото из базы код aspx - Default2.aspx

    <%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
    
    <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <div style="width: 800px; margin-top: 50px; margin-left: 200px;">
            <hr />
            <div class="gallery">
                <asp:ListView ID="lvPic" runat="server">
                    <ItemTemplate>
                        <a tabindex='<%# Container.DataItemIndex + 1 %>'>
                            <img src='<%# "ShowImage.ashx?id=" + Eval("pic_id") %>' alt="" style="border: 3px double #C0C0C0;
                                background-color: #FFFFFF;"></a>
                    </ItemTemplate>
                </asp:ListView>
            </div>
        </div>
    </asp:Content>


      и - aspx.cs - соответственно

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using albomDSTableAdapters;
    
    public partial class Default2 : System.Web.UI.Page
    {
        AlbumTableAdapter albTA = new AlbumTableAdapter();
        protected void Page_Load(object sender, EventArgs e)
        {
            lvBind();
        }
        public void lvBind()
        {
            lvPic.DataSource = albTA.GetData();
            lvPic.DataBind();
        }
    }
     

    результат - вот - загрузка фото в базу - загрузка

    просмотр картинок из базы - просмотр картинок

    • Предложено в качестве ответа PashaPash 3 мая 2012 г. 10:27
    • Помечено в качестве ответа janychar 11 мая 2012 г. 11:45
  • Благодарю всех за помощь. Оказалось, что просто нужно поставить тильду- ImageUrl='<%# "~/DisplayImage.ashx?ID="+Eval("ID")%>'
    • Помечено в качестве ответа janychar 11 мая 2012 г. 11:44

Все ответы

  •         string TableName = Request.QueryString["entity"];
            string FieldName = Request.QueryString["field"];
            string strWidth = Request.QueryString["width"];
            string strHeight = Request.QueryString["height"];
            string FieldId = Request.QueryString["FieldId"];
            double new_width = Convert.ToDouble(Request.QueryString["width"]);
            double new_height = Convert.ToDouble(Request.QueryString["height"]);
            if (FieldId == null) FieldId = "id_product";
            string id = Request.QueryString["id"];
            byte[] img = null;
            bool result = (id!=null)&&(TableName!=null)&&(FieldName!=null);
            if (result) 
            {
                SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["_1gb_admrmrConnectionString"].ConnectionString);
                SqlCommand cmd = new SqlCommand("select " + FieldName + " from " + TableName + " where " + FieldId + "=@" + FieldId, con);
                con.Open();
                cmd.Parameters.AddWithValue("@" + FieldId, id);
                object ObjImg = cmd.ExecuteScalar();
                con.Close();
                if (strWidth != null) new_width = Convert.ToInt32(strWidth);
                if (strHeight != null) new_height = Convert.ToInt32(strHeight);
                if (ObjImg == DBNull.Value) SetNoPhoto();
                else
                if (((byte[])ObjImg).Length > 0)
                {
                    img = (byte[])ObjImg;
                    MemoryStream strm = new MemoryStream(img);
                    System.Drawing.Image i = new Bitmap(strm);
                    double ramka_height = 100;
                    double ramka_width = 100;                
                    ChoisSize(ref new_height, i.Height, ref new_width, i.Width, ref ramka_height, ref ramka_width);
    
                    //Creating blank image as a canvas			
                    Bitmap imgOutput = new Bitmap((int)ramka_width, (int)ramka_height);
                    imgOutput.MakeTransparent();
                    imgOutput.MakeTransparent(Color.White);
                    //Create graphics object for alteration
                    Graphics newGraphics = Graphics.FromImage(imgOutput);
                    newGraphics.Clear(Color.FromArgb(0, 255, 255, 255)); //blank the image
                    //Setting High Quality Transformation
                    newGraphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                    newGraphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                    int deltax = (int)(ramka_width - new_width) / 2;
                    int deltay = (int)(ramka_height - new_height) / 2;
                    newGraphics.DrawImage(i, deltax, deltay, (int)new_width, (int)new_height);
                    newGraphics.Flush();
                    imgOutput.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
                    imgOutput.Dispose(); i.Dispose();
                }
                else 
                {
                    SetNoPhoto();
                }
            }

    Вот так делал я. Попробуйте использовать именно MemoryStream. Код большой потому что он не просто извлекает картинку, но еще меняет ее размер


  • предлагаю попробовать следующее :

    файл - ShowImage.ashx - для добавления фото в базу и извлечения фото из базы - правда SQLite - но принцип не сильно отличается

    <%@ WebHandler Language="C#" Class="ShowImage" %>
     
    using System;
    using System.Configuration;
    using System.Web;
    using System.IO;
    using System.Data;
    using System.Data.SqlClient;
    using albomDSTableAdapters;
     
    public class ShowImage : IHttpHandler
    {
        AlbumTableAdapter albDS = new AlbumTableAdapter();
        public void ProcessRequest(HttpContext context)
        {
            Int32 picid;
            if (context.Request.QueryString["id"] != null)
                picid = Convert.ToInt32(context.Request.QueryString["id"]);
            else
                throw new ArgumentException("No parameter specified");
           
            
            
            //Stream fs = ShowAlbumImage(picid);
            //BinaryReader r = new BinaryReader(fs);
           
            //for (int i = 0; i < fs.Length; i++)
            //{
                
            //}
    
            context.Response.ContentType = "image/jpg";
            Stream strm = ShowAlbumImage(picid);
            int _strm = 200000;
            byte[] buffer = new byte[_strm];
            int byteSeq = strm.Read(buffer, 0, _strm);
    
            while (byteSeq > 0)
            {
                context.Response.OutputStream.Write(buffer, 0, byteSeq);
                byteSeq = strm.Read(buffer, 0, _strm);
            }
        }
    
        public Stream ShowAlbumImage(int picid)
        {
            DataView dvIMG = new DataView(albDS.GetData(), "pic_id='" + picid + "'", "pic_id", DataViewRowState.CurrentRows);
            object img = dvIMG[0]["pic"];
            try
            {
                return new MemoryStream((byte[])img);
            }
            catch
            {
                return null;
            }
        }
     
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
     
     
    }


    страница для отображения фото из базы код aspx - Default2.aspx

    <%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
    
    <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <div style="width: 800px; margin-top: 50px; margin-left: 200px;">
            <hr />
            <div class="gallery">
                <asp:ListView ID="lvPic" runat="server">
                    <ItemTemplate>
                        <a tabindex='<%# Container.DataItemIndex + 1 %>'>
                            <img src='<%# "ShowImage.ashx?id=" + Eval("pic_id") %>' alt="" style="border: 3px double #C0C0C0;
                                background-color: #FFFFFF;"></a>
                    </ItemTemplate>
                </asp:ListView>
            </div>
        </div>
    </asp:Content>


      и - aspx.cs - соответственно

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using albomDSTableAdapters;
    
    public partial class Default2 : System.Web.UI.Page
    {
        AlbumTableAdapter albTA = new AlbumTableAdapter();
        protected void Page_Load(object sender, EventArgs e)
        {
            lvBind();
        }
        public void lvBind()
        {
            lvPic.DataSource = albTA.GetData();
            lvPic.DataBind();
        }
    }
     

    результат - вот - загрузка фото в базу - загрузка

    просмотр картинок из базы - просмотр картинок

    • Предложено в качестве ответа PashaPash 3 мая 2012 г. 10:27
    • Помечено в качестве ответа janychar 11 мая 2012 г. 11:45
  • janychar, пожалуйста, посмотрите предложенные варианты, если какой-либо решает вашу проблему, то отметьте его как ответ. Не оставляйте топик без ответа, Спасибо.

    Для связи [mail]

    Модератор
  • Всё равно не получается, видать чего-то не улавливаю. Может кто нибуди напишет маленький пример странички с GridView куда помещается картинка из базы данных
  • вот же я написал 

    <ItemTemplate>
              <a tabindex='<%# Container.DataItemIndex + 1 %>'>
               <img src='<%# "ShowImage.ashx?id=" + Eval("pic_id") %>' alt="" style="border: 3px double #C0C0C0;
                background-color: #FFFFFF;"></a>
    </ItemTemplate>

    а вставить его можно куда угодно - хоть в GridView - хоть в ListView смысл от этого не меняется. dataSet доступ к базе данных я не стал расписывать - он же простой Select 

    и пример вот есть - просмотр картинок из базы - просмотр картинок 

    Пиши на почту - www@krakoss.ru - вышлю тебе проект - тогда точно должен будешь понять 

    С Уважением Юрий 


    • Изменено krakoss 4 мая 2012 г. 4:43
  • А может быть такое, что не отображает картинки из-за их большого размера?
  • Конечно, может. И в данном случае вы получите исключение и сообщение об ошибке, типа - out of memory.
  • Попробывал вытащить на страницу одну картинку из базы явно задав ID тоесть написал тег <asp:Image ImageUrl="DisplayImage.ashx?ID=2" картинка отобразилась. Я так понял, что обработчик работает, но как заполнить GridView или ListView- запрос ImageUrl='<%# "DisplayImage.ashx?ID="+Eval("ID")%>' не срабатывает.
    • Изменено janychar 7 мая 2012 г. 9:57
  • Благодарю всех за помощь. Оказалось, что просто нужно поставить тильду- ImageUrl='<%# "~/DisplayImage.ashx?ID="+Eval("ID")%>'
    • Помечено в качестве ответа janychar 11 мая 2012 г. 11:44