vs2005,winform下,通过存储过程把图片存入数据库的image字段中,然后通过
byte[] pic=(byte[])ds.tables[0].rows[0]["pic"]读出来后,发现pic.length变成了16
插入代码
 byte[] mypic = new byte[int.Parse(spic.Length.ToString())];
            spic.Read(mypic,0,int.Parse(spic.Length.ToString()));                
                       string sql = "insert into mypic(picname,pic)values('"+DateTime.Now.ToLongTimeString()+"','@fs')";
            ExecuteSqlImg(sql,mypic);
                      
读取代码
 if(dt.Rows.Count>0)
{    
                byte[] bytepic = (byte[])dt.Rows[0]["pic"];
                myStream = new MemoryStream(bytepic,true);
                myStream.Read(bytepic,0,int.Parse(myStream.Length.ToString()));
                myStream.Position = 0;
            }
怎么回事呢?

解决方案 »

  1.   

    CREATE PROCEDURE sp_InsertPhots2
    @name as varchar(50),
    @image as image
    as
    insert into photos([name],photo)
    values (@name,@image)
    return @@identity
    GO            if (this.openFileDialog1.ShowDialog() != DialogResult.OK)
                    return;
                string filename = this.openFileDialog1.FileName;
                ImageFormat iformat = null;
                switch(filename.Substring(filename.IndexOf('.')+1).ToLower())
                {
                    case "bmp":
                        iformat=ImageFormat.Bmp;
                        break;
                    case "gif":
                        iformat=ImageFormat.Gif;
                        break;
                    case "jpg":
                        iformat=ImageFormat.Jpeg;
                        break;
                }
                MemoryStream ms = new MemoryStream();
                Image imgae=Image.FromFile(filename);
                imgae.Save(ms, iformat);
                try
                {
                    conn.Open();               
                    SqlCommand cmd = new SqlCommand("sp_InsertPhoto2", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Add(new SqlParameter("@name", SqlDbType.VarChar));
                    cmd.Parameters.Add(new SqlParameter("@image", SqlDbType.Image));
                    cmd.Parameters[0].Value = Path.GetFileNameWithoutExtension(filename);
                    cmd.Parameters[1].Value = ms.ToArray();
                    cmd.ExecuteNonQuery();            }
                finally
                {
                    conn.Close();
                }
    这是我的,你的应该是插入有错吧,我想,不确定啦
      

  2.   

    存储过程如下
    CREATE PROCEDURE  PIC_ADD
    @PicID int output,
    @PicName varchar(200) ,
    @Pic image 
     AS 
    INSERT INTO DO_POPIC(
    [PicName],[Pic]
    )VALUES(
    @PicName,@Pic
    )
    SET @PicID = @@IDENTITY
    结果还是一样的,在插入数据库前byte[]的长度是正常的,插入后再读出就变成16了,有人知道怎么回事么?
      

  3.   

    搞定,cmd.Parameters.Add(new SqlParameter("@image", SqlDbType.Image));里面不能加字段长度,呵呵