现,正在构建一数据录入界面使用vs2005 C#中文版+SQLServer2000中文版 winxp平台。要求:将图片录入到数据库中,数据库中相应的存储图片字段数据类型为:Image不知道在C#中,使用哪种控件可以将图片录入到数据库中。具体的原理请说说。谢谢

解决方案 »

  1.   

    pictruebox可以用来显示图片存数据库时 存的是该图片的二进制码
      

  2.   

    给你老大的文章看看就知道了http://blog.csdn.net/knight94/archive/2006/03/24/637800.aspx
      

  3.   

    <%@ WebHandler Language="C#" Class="Handler" %>using System;
    using System.IO;
    using System.Web;public class Handler : IHttpHandler { public bool IsReusable {
    get {
    return true;
    }
    }

    public void ProcessRequest (HttpContext context) {
    // 设置响应设置
    context.Response.ContentType = "image/jpeg";
    context.Response.Cache.SetCacheability(HttpCacheability.Public);
    context.Response.BufferOutput = false;
    // 设置 Size 参数
    PhotoSize size;
    switch (context.Request.QueryString["Size"]) {
    case "S":
    size = PhotoSize.Small;
    break;
    case "M":
    size = PhotoSize.Medium;
    break;
    case "L":
    size = PhotoSize.Large;
    break;
    default:
    size = PhotoSize.Original;
    break;

    // 设置 PhotoID 参数
    Int32 id = -1;
    Stream stream = null;
    if (context.Request.QueryString["PhotoID"] != null && context.Request.QueryString["PhotoID"] != "") {
    id = Convert.ToInt32(context.Request.QueryString["PhotoID"]);
    stream = PhotoManager.GetPhoto(id, size);
    } else {
    id = Convert.ToInt32(context.Request.QueryString["AlbumID"]);
    stream = PhotoManager.GetFirstPhoto(id, size);
    }
    // 从数据库获取照片,如果未返回照片,将获取默认的“placeholder”照片
    if (stream == null) stream = PhotoManager.GetPhoto(size);
    // 将图像流写入响应流中
    const int buffersize = 1024 * 16;
    byte[] buffer = new byte[buffersize];
    int count = stream.Read(buffer, 0, buffersize);
    while (count > 0) {
    context.Response.OutputStream.Write(buffer, 0, count);
    count = stream.Read(buffer, 0, buffersize);
    }
    }}
      

  4.   

    可以用DATALIST.把DATALIST进行摸板列编辑,在每一个单元个中都可以放进IMAGE控件.
      

  5.   

    C#中有没有现成的可视化的控件(比如类似组合框那样的选择一下图片文件,或者写入文件地址和文件名)就可以保存到数据库的Image字段的?谢谢!
      

  6.   

    hoho 如果这样的话
    lz可以考虑数据库字段就不要用image 直接保存图片路径就好了
      

  7.   

    好象没有这样的控件。image是按照二进制存储的,把图片当成二进制文件操作即可。它的操作方式同binary字段。
      

  8.   

    存图片代码:
    FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read);
    BinaryReader br = new BinaryReader(fs);
    imagebytes = br.ReadBytes(Convert.ToInt32(fs.Length));
    fs.Close();cmd.Parameters.Add("@studentPhoto", SqlDbType.Image).Value = imagebytes;读取图片代码:
    // 显示图片
    if(myReader["studentPhoto"].ToString() != "")// 如果图片字段不为空时显示图片数据
    {
    imagebytes = (byte[]) (myReader["studentPhoto"]);
    studentAbout.Text = myReader["studentAbout"].ToString(); // 预先显示一下附注信息,免得数据库图片字段有值,但不是图片时产生异常而不执行下面的内容。
    if (imagebytes.Length > 0)
    {
    MemoryStream stream = new MemoryStream(imagebytes, true); // 创建一个内存流,支持写入,用于存放图片二进制数据
    try
    {
    stream.Write(imagebytes, 0, imagebytes.Length);
    Bitmap FinalImage = new Bitmap(stream);
    this.studentPhoto.Image = FinalImage;
    this.studentPhoto.Refresh();
    }
    finally
    {
    stream.Close(); 
    }
    }
    }
      

  9.   

    点击一个Button,将选中的图片上传到数据库中:
        
    protected void updateButton_Click(object sender, EventArgs e)
        {
           
                SqlConnection conn = SqlBD.Opened_connnection(connStrLabel.Text);//创建连接            //获取上传图片的参数
                string filename = Path.GetFileName(chooseFile.PostedFile.FileName);
                string filepath = Server.MapPath("~\\临时文件夹\\" + filename);
                int imgdatalen = chooseFile.PostedFile.ContentLength;
                string imgtype = chooseFile.PostedFile.ContentType;
                byte[] imgdata = new byte[imgdatalen];            //保存图片到服务器指定文件夹
                chooseFile.PostedFile.SaveAs(filepath);            //获取上传图片的数据流
                Stream imgdatastream = new FileStream(filepath, FileMode.Open, FileAccess.Read);
                int n = imgdatastream.Read(imgdata, 0, imgdatalen);            try
                {
                    //设定执行插入命令的参数                
                    SqlCommand comm = new SqlCommand("insert into net_picture_tab (picture_code,picture_name,picture_type_id,Create_time,Is_in_use,picture_format,Content,re)" +
                                                    " values ('" + picture_codeTextBox.Text + "','" + picture_nameTextBox.Text + "','" + picture_typeDropDownList.SelectedItem.Value + "','" + DateTime.Now.ToString() + "',0,@imgtype,@imgdata,'" + reTextBox.Text + "')", conn);                //设置图片内容参数
                    SqlParameter paramData = new SqlParameter("@imgdata", SqlDbType.Image);
                    paramData.Value = imgdata;
                    comm.Parameters.Add(paramData);                //设置图片格式参数
                    SqlParameter paramType = new SqlParameter("@imgtype", SqlDbType.VarChar, 50);
                    paramType.Value = imgtype;
                    comm.Parameters.Add(paramType);                //执行插入
                    int numRowsAffected = comm.ExecuteNonQuery();            }
                catch (Exception ee)
                {
                    SqlBD.MessageBox(this.Page, "上传图片出错:" + ee.Message);
                    return;
                }
                finally
                {
                    conn.Close();
                }
                SqlBD.MessageBox(this.Page, "上传图片成功!");    
               
                //删除保存在服务器临时文件夹中的图片
                imgdatastream.Close();
                System.IO.File.Delete(filepath);        }
      

  10.   

    #region 文件上传
        /// <summary>
        /// 文件上传
        /// </summary>
        /// <returns></returns>
        public bool FileUp()
        {
            int k = FileUploadImag.PostedFile.FileName.LastIndexOf("."); // 取得文件名(抱括路径)里最后一个"."的索引
            string sEnlargeName = (FileUploadImag.PostedFile.FileName.Substring(k)).ToLower(); // 取得文件扩展名,并转换为小写
            if (sEnlargeName != ".jpg" & sEnlargeName != ".jpeg" & sEnlargeName != ".gif" & sEnlargeName != ".bmp" & sEnlargeName != ".png")
            {
                PComm.Comm.Show(this.Page, "图片的格式只可以是以下几种:jpg、jpeg、bmp、png、gif!");
                return false;
            }
            else
            {
                // 原理:用户上传文件到服务器时,因为在服务器的目录下可能已存在相同文件名的文件,此时直接保存的话,后者就会覆盖前者
                // 所以,在保存之前,首先要将上传的文件重新命名,命名的规则是:当前时间+一位随机数+后缀。
                // 然后,在数据库的文件表(File)中新增一条新的记录,记录该文件的ID、后缀、原文件名、现文件名、路径等。
                // 文件在系统中的操作,是通过文件ID来实现的。
                int MaxSizeM = 100;
                long lFileSize = MaxSizeM * 1024 * 1024; // 上传文件最大M数 转为字节数
                long sSize = FileUploadImag.PostedFile.ContentLength; // 取得文件的大小            if (FileUploadImag == null) return false;            if (FileUploadImag.PostedFile.FileName == "" || sSize <= 0) // 上传文件不为空
                {
                    PComm.Comm.Show(this.Page, "您还没有指定要上传的文件!");
                    return false;
                }            if (sSize >= lFileSize && MaxSizeM != 0) //MaxSizeM=0  则不限制上传文件的大小
                {
                    PComm.Comm.Show(this.Page, "文件太大,请确保文件小于" + System.Convert.ToString(MaxSizeM) + "M'");
                    return false;
                }            try
                {
                    FileOrginName = FileUploadImag.PostedFile.FileName.Substring(FileUploadImag.PostedFile.FileName.LastIndexOf("\\") + 1);
                    int i = FileUploadImag.PostedFile.FileName.LastIndexOf("."); // 取得文件名(抱括路径)里最后一个"."的索引
                    string sEnlargeName1 = FileUploadImag.PostedFile.FileName.Substring(i); // 取得文件扩展名,并转换为小写
                    sEnlargeName1 = sEnlargeName1.ToLower(); // 文件扩展名                string sNewName;
                    Random rnd = new Random(); // 用上传文件时的系统时间+一位随机数为文件重新命名。
                    int j = rnd.Next(0, 9); // 随机数
                    sNewName = DateTime.Now.Year.ToString();
                    sNewName = sNewName + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString();
                    sNewName = sNewName + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString();
                    sNewName = sNewName + DateTime.Now.Second.ToString() + j.ToString();
                    FileName = sNewName + sEnlargeName1;//文件名称
                    FileType = sEnlargeName1; //文件类型
                    Path = "LoadFile/bigImages";//源图片路径
                    oPath = "LoadFile/somallImages";//略缩图路径
                    string sSavePath = Page.Request.ServerVariables["APPL_PHYSICAL_PATH"] + Path + "/";//源图片路径
                    FilePach = sSavePath + FileName;//文件路径
                    OutlinePath = Page.Request.ServerVariables["APPL_PHYSICAL_PATH"] + oPath + "/";
                    OutlinePath += FileName;
                    FileUploadImag.PostedFile.SaveAs(System.IO.Path.Combine(sSavePath, FileName)); // 上传到服务器
                    MakeThumbnail(FilePach, OutlinePath, 200, 200, "Cut");
                    return true;
                }
                catch
                {
                    return false;
                }
            }
        }
        #endregion    #region 生成缩略图
        ///<summary>
        /// 生成缩略图
        /// 在网站开发时,生成缩略图是一个非常常见和实用的功能.以前在asp里只能借助com组件实现,现在在.net里可以利用框架的强大的类库轻松实现.
        /// </summary>
        /// <param name="originalImagePath">源图路径(服务器中的绝对路径,不是URL,含文件名,)</param>
        /// <param name="thumbnailPath">缩略图路径(服务器中的绝对路径,不是URL,含文件名,)</param>
        /// <param name="width">缩略图宽度</param>
        /// <param name="height">缩略图高度</param>
        /// <param name="mode">生成缩略图的方式</param>    
        public void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode)
        {
            System.Drawing.Image originalImage = System.Drawing.Image.FromFile(originalImagePath);        int towidth = width;
            int toheight = height;        int x = 0;
            int y = 0;
            int ow = originalImage.Width;
            int oh = originalImage.Height;        switch (mode)
            {
                case "HW"://指定高宽缩放(可能变形)                
                    break;
                case "W"://指定宽,高按比例                    
                    toheight = originalImage.Height * width / originalImage.Width;
                    break;
                case "H"://指定高,宽按比例
                    towidth = originalImage.Width * height / originalImage.Height;
                    break;
                case "Cut"://指定高宽裁减(不变形)                
                    if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
                    {
                        oh = originalImage.Height;
                        ow = originalImage.Height * towidth / toheight;
                        y = 0;
                        x = (originalImage.Width - ow) / 2;
                    }
                    else
                    {
                        ow = originalImage.Width;
                        oh = originalImage.Width * height / towidth;
                        x = 0;
                        y = (originalImage.Height - oh) / 2;
                    }
                    break;
                default:
                    break;
            }        //新建一个bmp图片
            System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);        //新建一个画板
            Graphics g = System.Drawing.Graphics.FromImage(bitmap);        //设置高质量插值法
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;        //设置高质量,低速度呈现平滑程度
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;        //清空画布并以透明背景色填充
            g.Clear(Color.Transparent);        //在指定位置并且按指定大小绘制原图片的指定部分
            g.DrawImage(originalImage, new Rectangle(0, 0, towidth, toheight),
                new Rectangle(x, y, ow, oh),
                GraphicsUnit.Pixel);        try
            {
                //以jpg格式保存缩略图
                bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            catch (System.Exception e)
            {
                throw e;
            }
            finally
            {
                originalImage.Dispose();
                bitmap.Dispose();
                g.Dispose();
            }
        }
        #endregion
      

  11.   

    你可以把图片COPY到你的项目下,在数据库里只存路径比较好
      

  12.   

    TO:请教:1.保存图片文件路径和文件名的方法是如何实现的?只把图片文件的路径和文件名以字符串的方式保存到数据库中就可以了吗?      2.以这种方式保存图片路径和文件名后,怎样将图片传给客户端呢?(图片做为表中的一个字段,我们的目的是将这个表中的所有数据传到客户端)
    To1:你既然想保存路径,那当然就只能以字符串方式保存啊,否则怎么还叫路径呢?To2:没办法,如果你这样只保存路径的话,想传给客户端,那也只能先通过数据库中保存的路径在本地先得到图片实体,然后再传给客户端(当然可以通过流的方式)..
    对你的两种方案总结一下:
    第一,先将图片转成二进制,存到数据库中,传给客户端时直接从数据库中取出,直接传,到客户端后再将二进制流转成图片...第二,存的时候只存路径,然后要给客户端的时候,再由路径得到图片,再传给客户端...两种办法互有利蔽,自己权衡一下吧...
      

  13.   

    如果打算做的系统是准备长期用,而不是来做实验的,
    建议将数据库中只存图片路径名,否则后期的维护会让你一个头n个大:
    数据库备份太成问题了,因为图片一张两张不显得大,稍微多点就要命。菜鸟我曾经参与的一个项目,数据库用了不到半年,有11GB+,而图片战了绝大部分空间
      

  14.   

    图片存入数据库FileStream fs = File.OpenRead("E:\\study\\pic1.jpg");
    byte[] fb = new byte[fs.Length];
    fs.Read(fb, 0, (int)fs.Length);
    string strSql = "INSERT INTO tb1_test(ID,Name,pic) VALUES(4,'zhengce',@file)"; //sql语句,其中保存图片的pic字段为Image类型
    string sConn = "Data Source=127.0.0.1;Initial Catalog=test;User ID=sa;Password=sa";//连接字符串
    SqlConnection myConn;
    SqlCommand myCom;
    myConn = new SqlConnection(sConn);
    try
    {
        myConn.Open();
        myCom = new SqlCommand(strSql, myConn);
        myCom.Parameters.Add("@file", SqlDbType.Image);
        myCom.Parameters["@file"].Value = fb;                
        myCom.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        myConn.Close();
    }