在这提问前,我也先查了下本论坛以前发过的关于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
/// 向数据库写入影像文件二进制流
/// </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
解决方案 »
- 登录窗体成功后弹出主窗体,下次就需要结束弹出窗体的进程,要不就错误,怎么解决?
- 知道地图上两点经纬度怎么能算出两点间的距离?
- 如何获取页面中特定格式的字符串
- 如何用ant 部署VS C#的工程?
- 采用HttpWebRequest和HttpWebReponse模拟登陆时返回错误:The remote server returned an error: (500) Internal Server Error.
- 请教一下关于ADO.NET连接的问题,感到很迷惑
- 关于 "==" 和 "Equals"
- 一个有意思的问题?UP有分!
- 在dataGrid邦定dataset数据集后,怎样来隐藏一列呢?来一下怎么不对啊
- 在线等待,我只想看到hello2,怎么办?. 请看看我的原代码,怎样清除Console.WriteLine写下的信息? .
- 请教一个DataGridView绑定数据源的简单问题,多谢!
- 怎么使用Control.SetStyle
odbcmd.Parameters.AddWithValue("cardnumber", _cardnum);
odbcmd.Parameters.AddWithValue("imagename", _imgname);
odbcmd.Parameters.AddWithValue("imagedata", photo);
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);
稍作修改!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);
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");
}
可以的哦你看下你的转换为字节数代码是不是有问题哦
我知道原因了,
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