在这提问前,我也先查了下本论坛以前发过的关于access存储图片的问题,我也参考了下师兄们的代码,但是今天我写上之后发现问题并没有解决。不知道是什么地方错了。发出代码想让大家帮帮忙,指点指点。        /// <summary>
        /// 向数据库写入影像文件二进制流
        /// </summary>
        /// <param name="_imgPath">图像文件路径</param>
        /// <param name="_cardnum">身份证号码</param>
        /// <param name="_imgname">图像名称</param>
        public void WriteImage(string _imgPath,string _cardnum,string _imgname)
        {            
            try
            {                
FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
BinaryReader reader = new BinaryReader(stream);
             byte[] photo = reader.ReadBytes((int)stream.Length);
             reader.Close();
             stream.Close();
                OleDbConnection connection = new OleDbConnection(connectionString);
                connection.Open();
                OleDbCommand odbcmd = new OleDbCommand("insert into tb_image values('" + _cardnum + "','" + _imgname + "',+'" + photo + "')", connection);
                odbcmd.Parameters.Add("cardnumber", OleDbType.VarChar).Value = _cardnum;
                odbcmd.Parameters.Add("imagename", OleDbType.VarChar).Value = _imgname;
                odbcmd.Parameters.Add("imagedata", OleDbType.LongVarBinary).Value=photo;                    
                odbcmd.ExecuteNonQuery();
                connection.Close();
                MessageBox.Show("图像插入成功!");
             }
            catch (Exception err)
            {
                MessageBox.Show(err.Message);                
            }            
        }
/// <summary>
        /// 读取图像
        /// </summary>
        /// <param name="imgname)">图像名称</param>
public void Get_image(string imgname)
        {
            string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\MyDB.mdb;Persist Security Info=True;Jet OLEDB:Database Password=wt123";
            byte[] imagebytes = null;
            OleDbConnection connection = new OleDbConnection(connectionString);
            connection.Open();
            OleDbCommand cmd = new OleDbCommand("select imagedata from tb_image where imagename='" + imgname + "'", connection);
            OleDbDataReader dr = cmd.ExecuteReader();
            dr.Read();
            while (dr.Read())
            {
                imagebytes = (byte[])dr.GetValue(0);
            }
            MemoryStream ms = new MemoryStream((byte[])dr[0]);
            Image image = Image.FromStream(ms); 
            imgBOX.Image = image;
            dr.Close();
            connection.Close();
                    }
现在遇到问题有这几个:
1.我插入时图片字节大小都在70000左右,读出来时只有20多。
2。在读取的方法中,每执行到 Image image = Image.FromStream(ms);  这里时就报“参数无效”
    另外由于要往access存入短暂的视频文件( Media Player支持的格式),再存入时也可以重用上面的存入图像的方法吗?在从数据库中读出时缓存到该程序的根目录下的一个文件夹下,如何形成指定的视频格式,如wmv,asf等。这样Media Player 的url就可以加载视频了。 
    谢谢大家了。。o(∩_∩)o  

解决方案 »

  1.   

    OleDbCommand odbcmd = new OleDbCommand("insert into tb_image values(@cardnum,@imgname,@photo)", connection);
    odbcmd.Parameters.AddWithValue("cardnumber", _cardnum);
    odbcmd.Parameters.AddWithValue("imagename", _imgname);
    odbcmd.Parameters.AddWithValue("imagedata", photo);
      

  2.   

    或者加上字段名
    OleDbCommand odbcmd = new OleDbCommand("insert into tb_image(字段名1,字段名2,字段名3) values(@cardnum,@imgname,@photo)", connection);
    odbcmd.Parameters.AddWithValue("cardnumber", _cardnum);
    odbcmd.Parameters.AddWithValue("imagename", _imgname);
    odbcmd.Parameters.AddWithValue("imagedata", photo);
      

  3.   


    稍作修改!OleDbCommand odbcmd = new OleDbCommand("insert into tb_image values(@cardnumber,@imagename,@imagedata)", connection);
    odbcmd.Parameters.AddWithValue("cardnumber", _cardnum);
    odbcmd.Parameters.AddWithValue("imagename", _imgname);
    odbcmd.Parameters.AddWithValue("imagedata", photo);
      

  4.   

    参考下这个openFileDialog1.Filter = "*.jpg|*.jpg|*.gif|*.gif|*.BMP|*.BMP";
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    string fullpath = openFileDialog1.FileName;
                    FileStream fs = new FileStream(fullpath, FileMode.Open);
                    byte[] imagebytes = new byte[fs.Length];
                    BinaryReader br = new BinaryReader(fs);
                    imagebytes = br.ReadBytes(Convert.ToInt32(fs.Length));
                    string strpath = Application.StartupPath + "\\data.mdb";
                    string constr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+strpath;
                    OleDbConnection olecon = new OleDbConnection(constr);
                    olecon.Open();
                    OleDbCommand oledcom = new OleDbCommand("insert into picdata(pix) values(@ImageList)", olecon);
                    oledcom.Parameters.Add("ImageList",OleDbType.Binary);
                    oledcom.Parameters["ImageList"].Value = imagebytes;
                    oledcom.ExecuteNonQuery();
                    olecon.Close();
                    MessageBox.Show("OK");
                } 
      

  5.   

    另外由于要往access存入短暂的视频文件( Media Player支持的格式),再存入时也可以重用上面的存入图像的方法吗?
    可以的哦你看下你的转换为字节数代码是不是有问题哦
      

  6.   

    谢谢大家咯。 
    我知道原因了,
    OleDbCommand odbcmd = new OleDbCommand("insert into tb_image values('" + _cardnum + "','" + _imgname + "',+'" + photo + "')", connection); 这个我是直接往表里插入的,图像的二进制数据由于没采用 :
    OleDbCommand odbcmd = new OleDbCommand("insert into tb_image(字段名1,字段名2,字段名3) values(@cardnum,@imgname,@photo)", connection); 带参数的,所以插入的时候就会出问题,读出来的时候就不对了。 再次谢谢大家。。 o(∩_∩)o