#c# #mysql
#c# #mysql
Вопрос:
Пожалуйста, помогите мне с этим, поскольку я перепробовал так много решений, предложенных из нескольких источников. У меня есть pictureBox2 с кнопкой показать под ним. Идея в том, что если я нажму кнопку «Показать», изображение в формате JPEG появится в pictureBox2 из моей MySql
базы данных. Изображение находится в большом двоичном поле в таблице с именем Recipy (прошу прощения за неправильное написание для recipe). Это мой код:
MySqlCommand comm;
MySqlDataReader rdr;
MySqlDataAdapter da;
string Query = "select image from chefassist.recipy where name ='" textBox1.Text "';";
MySqlConnection connectToD = new MySqlConnection("server = localhost; database = chefassist; uid
= root; pwd = n0clu387;");
comm = new MySqlCommand(Query, connectToD);
da = new MySqlDataAdapter(comm);
try
{
connectToD.Open();
rdr = comm.ExecuteReader();
while(rdr.Read())
{
//string sName = rdr.GetString("name");
//textBox1.Text = sName;
byte[] imgg = (byte[])(rdr["image"]);
if (imgg == null)
{
pictureBox2.Image = null;
}
else
{
MemoryStream mstream = new MemoryStream(imgg);
pictureBox2.Image = System.Drawing.Image.FromStream(mstream);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Комментарии:
1. Ваш запрос уязвим для SQL-инъекций. Рассмотрите возможность использования параметризованных запросов
Ответ №1:
Прежде всего, вы должны использовать параметры в своем SQL-запросе
string Query = "select image from chefassist.recipy where name = @Param;
using( MySqlConnection connectToD = new MySqlConnection("server = localhost; database = chefassist; uid = root; pwd = n0clu387;"))
{
using( comm = new MySqlCommand(Query, connectToD))
{
com.Parameters.AddWithValue("@Param", textBox1.Text); --More secure like this.
//da = new MySqlDataReader(comm); --I didn't understand why you need this. Use
DataReader instead, your code below seems using a datareader.
try
{
connectToD.Open();
//If you are sure that the query will return only one image, you can use
// byte[] buffer = (byte[])(comm.ExecuteScalar());
//If you want to use a reader
var rdr = comm.ExecuteReader();
while(rdr.Read())
{
//string sName = rdr.GetString("name");
//textBox1.Text = sName;
byte[] buffer = (byte[])(rdr["image"]);
if (imgg == null)
{
pictureBox2.Image = null;
}
else
{
pictureBox2.Image = ByteArrayToImage(buffer);
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Вы можете попробовать этот метод для преобразования вашего байтового массива в изображение
public Image ByteArrayToImage(byte[] buffer)
{
var ms = new MemoryStream(buffer);
Image returnImage = Image.FromStream(ms);
return returnImage;
}
Комментарии:
1. Спасибо за помощь. Я получаю это сообщение об ошибке, в котором говорится, что не удается преобразовать byte[] в system.io.stream. Есть идеи?
2. Какая строка выдает ошибку? этот: var ms = новый поток памяти (буфер); ?
3. pictureBox2.Image = System. Рисование. Изображение. FromStream(imgg);
4. Верно, извините, я изменил код. Фактически, вы должны заменить его на pictureBox2.Image = ByteArrayToImage(buffer);
5. Я приношу извинения за то, что это боль, но я все равно получаю недопустимый параметр
Ответ №2:
Это мой код для сохранения изображения в моей базе данных MySQL. Я использую MySQLWorkbench:
try
{
OpenFileDialog opn = new OpenFileDialog();
opn.Filter = "Choose Image(*.jpg; *.png; *.jpeg)|*.jpg; *.png; *.jpeg";
if (opn.ShowDialog() == DialogResult.OK)
{
pictureBox1.Image = Image.FromFile(opn.FileName);
}
}
catch (Exception)
{
throw;
}
MySqlCommand comm;
MySqlDataReader rdr;
//string Query = "UPDATE `chefassist`.`recipy` SET image = '@Img' WHERE name='Herb and Lemon Soup'";
string Query = "UPDATE `chefassist`.`recipy` image=@img where name='" this.textBox1.Text "';";
MySqlConnection connectToD = new MySqlConnection("server = localhost; database = chefassist; uid = root; pwd = n0clu387;");
comm = new MySqlCommand(Query, connectToD);
connectToD.Open();
try
{
MemoryStream ms = new MemoryStream();
pictureBox1.Image.Save(ms, pictureBox1.Image.RawFormat);
byte[] img = ms.ToArray();
MySqlCommand cmd;
//String qry = "UPDATE `chefassist`.`recipy` SET image = '@Img' WHERE name = 'Herb and Lemon Soup'";
string qry = "UPDATE `chefassist`.`recipy` SET image=@img where name='" this.textBox1.Text "';";
comm = new MySqlCommand(qry, connectToD);
//comm.Parameters.Add("@Id", MySqlDbType.Int32);
comm.Parameters.Add("@img", MySqlDbType.MediumBlob);
//comm.Parameters["@Id"].Value = txtAddress.Text;
comm.Parameters["@img"].Value = img;
if (comm.ExecuteNonQuery() == 1)
{
MessageBox.Show("Data Inserted");
}
}
catch (Exception)
{
throw;
}
Это моя функция для сохранения ByteArrayToImage:
public Image ByteArrayToImage(byte[] buffer)
{
MemoryStream ms = new MemoryStream(buffer);
Image returnImage = Image.FromStream(ms);
return returnImage;
}
Наконец, это мой текущий код в моей кнопке «Показать»:
MySqlCommand comm;
//MySqlDataReader rdr;
//MySqlDataAdapter da;
string Query = "select image from chefassist.recipy where image = @img";
using (MySqlConnection connectToD = new MySqlConnection("server = localhost; database = chefassist; uid = root; pwd = n0clu387;"))
{
using (comm = new MySqlCommand(Query, connectToD))
{
comm.Parameters.AddWithValue("@img",textBox1.Text);
connectToD.Close();
try
{
connectToD.Open();
var rdr = comm.ExecuteReader();
while (rdr.Read())
{
byte[] imgg = (byte[])(rdr["image"]);
if (imgg == null)
{
pictureBox2.Image = null;
}
else
{
//pictureBox2.Image = System.Drawing.Image.FromStream(imgg);
pictureBox2.Image = ByteArrayToImage(imgg);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}