环境:vs2008 ,winForm应用程序,sql2000+sp4数据库。
保存时的语句用存储过程: if(pictureBox1.Image!=null)
                {
                    using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
                    {
                        myCommand.Parameters.Add("@photo", SqlDbType.Image);
                        pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);
                        Byte[] bt = new Byte[ms.Length];
                        ms.Read(bt, 0, (int)ms.Length);
                        myCommand.Parameters["@photo"].Value = bt;                        
                    }                }
                try
                {
                    myCommand.ExecuteNonQuery();
                    MessageBox.Show("保存成功.");
                    this.DialogResult = DialogResult.OK;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
-----------------保存正常,没有问题。
读取时报错,提示参数无效。。  //图片
                if (dr["photo"].ToString() != "")
                {
                    try
                    {
                        MemoryStream ms = new MemoryStream(dr.GetSqlBinary(0).Value);
                        Image image = Image.FromStream(ms, true); //此句出错,将true去掉也出错,提示都是参数无效。
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
========请老师们帮忙分析分析,谢谢!!

解决方案 »

  1.   

    dr.GetSqlBinary(0).Value改为:dr.GetBytes(0)看看
      

  2.   

    先看你你的dr.GetSqlBinary(0).Value值是否对吧
      

  3.   


      MemoryStream ms = new MemoryStream(dr.GetSqlBinary(0).Value);调式一下这个值或者输出一下。。看得到的是个什么
      

  4.   

    MemoryStream ms = new MemoryStream((byte[])dr.Rows[0]["photo"]);
      

  5.   


    修改后提示指定的转换无效。
    另外:
    先看你你的dr.GetSqlBinary(0).Value值是否对吧是对的,就是photo的值。
      

  6.   

    数据库字段的类型是 Image类型。
      

  7.   

    我用MessageBox.Show(dr[0].ToString());
    输出的值是:System.Byte[]
      

  8.   


     if (dr["photo"] != DBNull.Value)
                    {
                        try
                        {
                            byte[] buffer = (byte[])dr["photo"];
                            MemoryStream ms = new MemoryStream(buffer);
                            Image image = Image.FromStream(ms);
                            ms.Close();                    
                           }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ex.Message);
                        }
                    }
      

  9.   


    还是提示参数无效。Image image = Image.FromStream(ms);
    是不是我存的就有问题呢,数据库字段用Image没问题吧。
      

  10.   

    我知道了!你要用while循环来读去流
      

  11.   

    byte[] 里全部是 0 ...
      

  12.   

    你存入的图片字节数据里面全是0.
    修改一:
    Byte[] bt = new Byte[ms.Length];
    ms.Position = 0;
    ms.Read(bt, 0, (int)ms.Length);修改二:
    Byte[] bt = ms.ToArray();显然第二种方法简单多了,用MemoryStream自带的方法ToArray就可以获得字节数据。
      

  13.   

    图片保存的数据库及从数据库中读取出图片,主要是用到了序列化与反序列化
    简单说一下:选对图片进行序列化:         private byte[] ConvertByte(Image image)
            {
                MemoryStream ms = new MemoryStream();
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(ms, (object)image);
                ms.Close();
                return ms.ToArray();
            }///一个小例子`你自己修改一下吧 
    public bool  WhiteImage(PictureBox Pic, string conn)
            {
                SqlConnection scon = new SqlConnection(conn);
                try
                {
                    string sql = "insert into 表(Pic) values(@image_)";
                    scon.Open();
                    SqlCommand cmd = new SqlCommand(sql, scon);
                    cmd.Parameters.Add("@image_", SqlDbType.Image, (int)ConvertByte(Pic.Image).Length);
                    cmd.Parameters["@image_"].Value = ConvertByte(Pic.Image);
                    cmd.ExecuteNonQuery();
                    cmd.Dispose();
                    scon.Close();
                    return true;
                }
                catch (Exception)
                {
                    scon.Close();
                    return false;
                }
            }
    读取数据时先要将读到的数据反序列化成图片,然后指定给要显示的图片框
            private Image ConvertImage(byte[] bytes)
            {
                MemoryStream ms = new MemoryStream(bytes, 0, bytes.Length);
                BinaryFormatter bf = new BinaryFormatter();
                object obj = bf.Deserialize(ms);
                ms.Close();
                return (Image)obj;
            }
            public void ReadImage(PictureBox Pic, string Conn)
            {
                string con = Conn;
                SqlConnection scon = new SqlConnection(con);
                try
                {
                    scon.Open();
                    string sql = "sql语句";                SqlCommand cmd = new SqlCommand(sql, scon);
                    SqlDataReader dr = cmd.ExecuteReader();
                    if (dr.Read())
                    {
                        byte[] bytes2 = (byte[])dr["HomePic"];
                        Pic.Image = ConvertImage(bytes2);
                        dr.Close();
                    }
                }
                catch (Exception)
                {
                }
                finally
                {
                    scon.Close();
                }
            }
    测试通过 没问题
      

  14.   

    在数据库中,将图片字段设为Binery二进制型,将图片转换为二进制进行保存
    我原先是这样做的
      

  15.   

    这样应该可以
    MemoryStream ms = new MemoryStream((byte[])dr.Rows[0]["photo"]);
      

  16.   

    如果photo字段是image类型的话,我上面的代码应该没问题啊
    保存图片:            Image image = pictureBox1.Image;
                MemoryStream ms = new MemoryStream();
                image.Save(ms, ImageFormat.Jpeg);  //我这里用的是jpg文件
                byte[] buffer = ms.ToArray();
                ms.Close();
                
                con.Open();
                using (SqlCommand cmd = new SqlCommand(sql, con))
                {
                    cmd.Parameters.Add(new SqlParameter("@photo", buffer));
                    cmd.ExecuteNonQuery();
                }
                con.Close();读取图片: DataSet dst = new DataSet();
                con.Open();
                using (SqlCommand cmd = new SqlCommand(sql, con))
                {
                    SqlDataAdapter sda = new SqlDataAdapter(cmd);
                    sda.Fill(dst);
                }
                con.Close();            byte[] buffer = null;
                DataRow drow = dst.Tables[0].Rows[0];
                if (drow["photo"] != DBNull.Value)
                {
                    buffer = (byte[])drow["photo"];
                }
                MemoryStream ms = new MemoryStream(buffer);
                Image image = Image.FromStream(ms);
                ms.Close();
                pictureBox1.Image = image;
      

  17.   

    结贴,还是晚上有真相。谢谢大家帮助。特别感谢sunny906