C# 访问Access存取图片
图片存入ole字段,看有的代码是获取图片的字节数组转换为base64字符串,存入数据库;显示图片是把base64字符串转换为字节数组再显示;直接存字节数组可能还好一点;
插入的时候用带参数的sql写法比较好;用拼接sql一般会出错;
测试表有三个字段,加载一个图片然后插入记录;
插入以后如下;第5、6条是对的,3、4没插对;如果要png、jpeg、gif等格式都支持,写为 image1.Save(ms, image1.RawFormat);
读取并显示如下;
插入记录的代码,
Image image1;
MemoryStream ms = new MemoryStream();
byte[] arr1 = null; ;
if (pictureBox1.Image != null)
{
image1.Save(ms, image1.RawFormat);
arr1 = new byte[ms.Length];
ms.Position = 0;
ms.Read(arr1, 0, (int)ms.Length);
//pic1 = Convert.ToBase64String(arr1);
}
ms.Close();
if (button1.Text == "添加")
{
if (textBox1.Text == "")
{
MessageBox.Show("名字不能为空!", "添加信息");
return;
}
else
{
string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + Environment.CurrentDirectory + "\\mytest.mdb'";
string query = "INSERT INTO testpic (a1, a2, ppp) VALUES (?,?,?)";
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
using (OleDbCommand cmd = new OleDbCommand(query, conn))
{
// 这里设置参数值,注意索引对应你SQL语句中参数的位置
cmd.Parameters.AddWithValue("?", textBox1.Text);
cmd.Parameters.AddWithValue("?", textBox2.Text);
cmd.Parameters.AddWithValue("?", arr1);
conn.Open();
int rowsAffected = cmd.ExecuteNonQuery();
conn.Close();
}
}
textBox1.Text = "";
textBox2.Text = "";
}
}
读取显示图片的代码,
private void button2_Click(object sender, EventArgs e)
{
string sql1 = "select * from testpic where id = " + 6;
byte[] buff = null;
buff = achelp.GetBufferFromDB(sql1, "ppp");
System.IO.MemoryStream picbuf = new System.IO.MemoryStream(buff);
Image image = Image.FromStream(picbuf, true);
picbuf.Close();
pictureBox1.Image = image;
}
......
//返回图片byte[]
public byte[] GetBufferFromDB(string strSql, string fieldname)
{
byte[] buff = null;
if (conn_str == null)
{
return null;
}
try
{
ole_connection.Open();//打开连接
if (ole_connection.State == ConnectionState.Closed)
{
return null;
}
ole_command.CommandText = strSql;
ole_command.Connection = ole_connection;
ole_reader = ole_command.ExecuteReader(CommandBehavior.Default);
if (ole_reader.Read())
{
buff = (byte[])ole_reader[fieldname];
}
ole_reader.Close();
ole_reader.Dispose();
}
catch (System.Exception e)
{
//Console.WriteLine(e.ToString());
MessageBox.Show(e.Message);
}
finally
{
if (ole_connection.State != ConnectionState.Closed)
{
ole_connection.Close();
}
}
return buff;
}
要先执行ole_reader.Read(),然后才能取ole_reader[fieldname];