下面是我的代码:
              ds=c.Show_photo("1");//这句是将图片放在dataset中
            byte[] pic =(byte[])ds.Tables[0].Rows[0].ItemArray[0];//取出图片并转换为byte[]数组
            ShowData_Image(pic, pictureBox1);//调用方法,方法内容看下面
 public void ShowData_Image(byte[] DI, PictureBox Ima)  //方法在这里,显示数据库图片
        {
            byte[] buffer = DI;//这里就是上面的pic
            MemoryStream ms = new MemoryStream(buffer);
           
            Ima.Image = Image.FromStream(ms);//????运行到这里出错了,说是参数无效
        }数据库里图片类型是image的,我用分析器查了下有数据 是这样的形式:0xFFD8FFE000104A464946000101010000
应该是对的吧这个怎么解决,大家帮帮忙,图片已经存进去了,没有错的,关键是取出的问题

解决方案 »

  1.   

    byte[] pic =(byte[])ds.Tables[0].Rows[0].ItemArray[0];
    这句应该就是byte[] pic =(byte[])ds.Tables[0].Rows[0][index];就行了
      

  2.   

    MemoryStream;
    FromStream;
    是不是这的问题呀?
    2个流不是相同的流。
    试下这样:
    MemoryStream ms =new MemoryStream(buffer);
    Bitmap bmp=new Bitmap(ms);
    pictureBox.Image=bmp;
      

  3.   

    2L还是不对:Bitmap bmp=new Bitmap(ms);//参数无效
      

  4.   

    问题在这: 
    C# codepic = (byte[])ds.Tables[0].Rows[0].ItemArray[3]; 
    通过一个数组来获取或设置此行的所有值!而不是,这行这列的值! 
    应该这样:
    C# codepic=(byte[])ds.Tables[0].Rows[0]["图片列的列名"].ToString();
    ToString()的没这么写过,不知道行不行。 
    给你个例子参考下: C# codeprivate void button1_Click(object sender, EventArgs e)
            {
                
                byte[] imagebytes = null;
                  
                    //打开数所
                    SqlConnection con = new SqlConnection("server=(local);uid=sa;pwd=;database=db_05");
                    con.Open();
                    SqlCommand com = new SqlCommand("select top 1* from tb_01", con);
                    SqlDataReader dr = com.ExecuteReader();
                    while (dr.Read())
                    {
                        imagebytes = (byte[])dr.GetValue(1);
                    }
                    dr.Close();
                    com.Clone();
                    con.Close();
                    MemoryStream ms = new MemoryStream(imagebytes);
                    Bitmap bmpt = new Bitmap(ms);
                    pictureBox1.Image = bmpt;        }
    参考下.
      

  5.   

    问题在这: 
    C# codepic = (byte[])ds.Tables[0].Rows[0].ItemArray[3]; 
    通过一个数组来获取或设置此行的所有值!而不是,这行这列的值! 
    应该这样:
    C# codepic=(byte[])ds.Tables[0].Rows[0]["图片列的列名"].ToString();---------
    都一样的吧,ds.Tables[0].Rows[0].ItemArray[0];这句就取出第0行,第0列的值
    这跟 ds.Tables[0].Rows[0][0]应该是一样的我只要读一张图片就行了我试了你的方法还是参数错误
      

  6.   

    LZ数据,以及取数据的方式都是对的。
    你可以测试下把那个buffer存到本地,图片是可以正常显示的。问题在于Ima.Image = 不能这样指定。从流生成图,你没让他呈现出来。
    PictureBox可以有2种方式指定Image:
    1、pictureBox1.Image = Image.FromFile( url );//先存个临时文件,再指定。2、如果非要是动态的,内存中的。先示例出一个Bitmap,再用Graphics用那个buffer画一个。    Bitmap bmp= new Bitmap(200, 100);
        Graphics g= Graphics.FromImage(bmp);
        g.DrawImage( image,Point );
        pictureBox1.Image = bmp;
      

  7.   

    最简单的办法 ,你先把buffer存到本地。再指定pictureBox的路径
      

  8.   

    先直接读 看行不行
    SqlDataReader myDataReader= myCommand.ExecuteReader(CommandBehavior.CloseConnection);
    Response.Clear();
    Response.BinaryWrite((byte[])myDataReader["ImageData"]); //ImageData列名
      

  9.   

    问题解决没有?
    我这写了个程序,把图片存到数据库,然后显示在pictureBox,一点问题都没有!
    System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("server=.;uid=sa;pwd=sa;database=MyTestDB");
            private void button1_Click(object sender, EventArgs e)
            {
                int rtnNum = 0;
                openFileDialog1.Filter = "*.jpg|*.JPG|*.GIF|*.GIF|*.BMP|*.BMP";
                if (openFileDialog1.ShowDialog()==DialogResult.OK)
                {
                    string filePath = openFileDialog1.FileName;
                    System.IO.FileStream stream = new System.IO.FileStream(filePath, System.IO.FileMode.Open);
                    byte[] imagebytes = new byte[stream.Length];
                    System.IO.BinaryReader reader = new System.IO.BinaryReader(stream);
                    imagebytes = reader.ReadBytes(Convert.ToInt32(stream.Length));
                    if (conn.State==ConnectionState.Closed)
                    {
                        conn.Open();
                    }
                    System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("insert into imagetable values(@image)",conn);
                    cmd.Parameters.Add("image", SqlDbType.Image);
                    cmd.Parameters["image"].Value = imagebytes;
                    rtnNum = cmd.ExecuteNonQuery();
                    if (rtnNum>0)
                    {
                        MessageBox.Show("Ok");
                    }
                    else
                    {
                        MessageBox.Show("Error");
                    }
                    conn.Close();
                }
            }        private void button2_Click(object sender, EventArgs e)
            {
                byte[] imagebytes = null;
                if (conn.State==ConnectionState.Closed)
                {
                    conn.Open();
                }
                System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("select image from imagetable",conn);
                System.Data.SqlClient.SqlDataReader reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    imagebytes = (byte[])reader.GetValue(0);
                }
                reader.Close();
                conn.Close();
                System.IO.MemoryStream ms = new System.IO.MemoryStream(imagebytes);
                Bitmap bmp = new Bitmap(ms);
                pictureBox1.Image = bmp;
            }
    参考下.
      

  10.   

      MemoryStream ms = new MemoryStream((byte[])ds.Tables["Carifo"].Rows[0]["Photo"]);
                  
                   Image image=Image.FromStream(ms, true);
                    pictureBox1.Image = image;
    这样就好了 
    楼上的也没错。。
      

  11.   

    可以了,问题找到了,不是这里的问题,而是我的一个方法写错了:
    public string SaveImage(string id, byte[] p)//这个是将图片存进数据库的方法
            {
                
                DataBase db = new DataBase();//连接数据库            try
                {
                    SqlParameter[] ps ={
                        db.MakeInParam("@id",SqlDbType.VarChar,5,id),
                        db.MakeInParam("@photo",SqlDbType.Binary,10000,p)//就是这里,本来这个10000的值是16,现在改10000就好了,原来是太小了不能显示
                    };
                    db.RunProc("Save_Image", ps);
                    return "0";
                }
                catch (Exception ee)
                {
                    MessageBox.Show(ee.ToString());
                    return null;
                }
                finally
                {
                    db.Close();
                    db = null;
                }总之是谢谢大家了