这就是我需要的:我正在制作一个用于库存控制的软件,但我必须在数据中上传产品的图像。我正在使用C#和MySQL。
我不知道如何将加载到pictureBox中的图像放到MySQL表中。 有任何想法吗?我完全迷失在这里。
我使用以下代码将图像加载到pictureBox中:
using (OpenFileDialog dlg = new OpenFileDialog())
{
dlg.Title = "Open Image";
dlg.Filter = "All Files (*.*)|*.*";
if (dlg.ShowDialog() == DialogResult.OK)
{
pictureBox1.Image = new Bitmap(dlg.FileName);
}
}
如何将加载的图像插入MySQL表?我想表中的image属性应该是:
`img` LONGBLOB NOT NULL
然后,如何将图像从MySQL回调到pictureBox?我想(再次)查询它是这样的:
select img from table_name where id = '';
最后,当我有查询时,如何将图像从MySQL加载到pictureBox?
非常感谢。
答案 0 :(得分:3)
我将提供两种解决方案。第一种解决方案是直接将原始图像以字节为单位存储在数据库中。第二个解决方案是我个人推荐的 - 而不是使用数据库中的图像文件的路径。
这是article的摘录,它提出了一些关于是否BLOB的优秀观点。
嗯,有几个原因你不应该存储二进制数据 在您的数据库中:
在SQL数据库中存储数据的全部意义在于对数据进行某种排序和结构,以及能够 搜索这些数据。但是你如何在一个二进制数据中搜索 图片?
对于大型数据集,存储二进制数据会快速运行数据库文件的大小,从而难以控制大小的数据集 数据库。
为了在数据库中存储二进制数据,您必须不断地逃避和取消数据,以确保没有任何中断。
将图像存储在文件系统上的检索速度略快。现在这里有一些理由你应该:
您可能希望存储二进制数据有一个很好的理由 在数据库中:
- 复制。将图像存储在数据库中允许将所有数据集中存储,这些数据更易于携带且易于使用 复制。
以下是选择图像文件的方法:
using (var openFileDialog = new OpenFileDialog())
{
openFileDialog.Title = "Choose Image File";
openFileDialog.InitialDirectory =
Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
openFileDialog.Filter = "Image Files (*.bmp, *.jpg)|*.bmp;*.jpg";
openFileDialog.Multiselect = false;
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
pictureBox1.Image = new Bitmap(openFileDialog.FileName);
}
// store file path in some field or textbox...
textBox1.Text = openFileDialog.FileName;
}
解决方案1:BLOB方法
// Write to database like this - image is LONGBLOB type
string sql = "INSERT INTO imagetable (image) VALUES (@file)";
// remember 'using' statements to efficiently release unmanaged resources
using (var conn = new MySqlConnection(cs))
{
conn.Open();
using (var cmd = new MySqlCommand(sql, conn))
{
// parameterize query to safeguard against sql injection attacks, etc.
cmd.Parameters.AddWithValue("@file", File.ReadAllBytes(textBox1.Text));
cmd.ExecuteNonQuery();
}
}
// read image from database like this
string sql = "SELECT image FROM imagetable WHERE ID = @ID";
using (var conn = new MySqlConnection(cs))
{
conn.Open();
using (var cmd = new MySqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@ID", myInt);
byte[] bytes = (byte[])cmd.ExecuteScalar();
using (var byteStream = new MemoryStream(bytes))
{
pictureBox1.Image = new Bitmap(byteStream);
}
}
}
解决方案2:在文件系统上存储文件路径
// Some file movement to the desired project folder
string fileName = Path.GetFileName(this.textBox1.Text);
string projectFilePath = Path.Combine(projectDir, fileName);
File.Copy(this.textBox1.Text, projectFilePath);
// Write to database like this - imagepath is VARCHAR type
string sql = "INSERT INTO imagepathtable (imagepath) VALUES (@filepath)";
using (var conn = new MySqlConnection(cs))
{
conn.Open();
using (var cmd = new MySqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@filepath", projectFilePath);
cmd.ExecuteNonQuery();
}
}
// read from database like this
string sql = "SELECT imagepath FROM imagepathtable WHERE ID = @ID";
using (var conn = new MySqlConnection(cs))
{
conn.Open();
using (var cmd = new MySqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("@ID", myInt);
pictureBox1.Image = new Bitmap(cmd.ExecuteScalar().ToString());
}
}