Когда я пытаюсь загрузить изображение из базы данных mysql, я получаю сообщение об ошибке «Параметр недействителен», и когда я пытаюсь загрузить изображение из БД

#c# #mysql

#c# #mysql

Вопрос:

Программа написана на C #, а база данных — MySQL.
У меня есть 2 ошибки: первая при загрузке программы (параметр недействителен) и вторая (у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом с ‘(Slika) значения (_binary ‘?PNG).

Итак, я попробовал использовать @blob (до того, как я сохранял его только как PictureBox, который люди называли ложным), и я получаю эту ошибку.

Также полезно упомянуть, что я всегда сохраняю один и тот же файл, который является BLOB — 55B. Это код:

 private void button3_Click(object sender, EventArgs e)
        {
            con.OpenConnection2();
            string query2 = "update tabla set (Slika) values (@Blob)";
            cmd.Connection = Connectioncl.connection2;
            cmd.CommandText = query2;
            cmd.Parameters.AddWithValue("Blob", save(pictureBox3));
            cmd.ExecuteNonQuery();
            MessageBox.Show("Data Save in Database ", "Data Save", MessageBoxButtons.OK, MessageBoxIcon.Information);
            pictureBox2.Image = pictureBox3.Image;
            this.Refresh();
        }
 

Я получаю параметр недопустимый в этом коде, где изображение должно загружаться из базы данных сразу после запуска программы:

 private void Form2_Load(object sender, EventArgs e)
        {
            try
            {
                textBox1.Text = Form1.id; //just to check if its the correct ID
                con.OpenConnection();
                label1.Text = Form1.ime;
                label2.Text = Form1.prezime;
                timer1.Start();
                string query = "select * from tabla where ID='"   ID   "'";
                cmd.Connection = Connectioncl.connection;
                cmd.CommandText = query;
                MySqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    pictureBox2.Image = displayImage((byte[])dr["Slika"]);

                }
                dr.Close();
                con.CloseConnection();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            
        }
 

И вот весь код Form2 (Form1 работает отлично):

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
using System.IO;

namespace Maturski_Rad_1
{
    public partial class Form2 : Form
    {
        Connectioncl con = new Connectioncl();
        MySqlCommand cmd = new MySqlCommand();
        string ID = Form1.id;

        public Form2()
        {
            InitializeComponent();
        }

        public byte[] save(PictureBox pb)
        {
            MemoryStream mstr = new MemoryStream();
            pictureBox3.Image.Save(mstr, pb.Image.RawFormat);
            return mstr.GetBuffer();
        }

        public Image displayImage(byte[] slika)
        {

            MemoryStream mstr = new MemoryStream(slika);
            return Image.FromStream(mstr);
        }  

        private void Form2_Load(object sender, EventArgs e)
        {
            try
            {
                textBox1.Text = Form1.id; //just to check if its the correct ID
                con.OpenConnection();
                label1.Text = Form1.ime;
                label2.Text = Form1.prezime;
                timer1.Start();
                string query = "select * from tabla where ID='"   ID   "'";
                cmd.Connection = Connectioncl.connection;
                cmd.CommandText = query;
                MySqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    pictureBox2.Image = displayImage((byte[])dr["Slika"]);

                }
                dr.Close();
                con.CloseConnection();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            
        }


        private void toolTip1_Popup(object sender, PopupEventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void panel1_MouseHover(object sender, EventArgs e)
        {
            toolTip1.Show("Vas ID je: "   Form1.id, panel1);
            toolTip1.UseFading = true;
        }

        private void label3_Click(object sender, EventArgs e)
        {

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            label4.Text = DateTime.Now.ToShortTimeString();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                OpenFileDialog dialog = new OpenFileDialog();
                dialog.Title = "Odaberite sliku";
                dialog.Filter = " (*.jpg;*.png;*.jpeg) | *.jpg;*.png;*.jpeg";
                DialogResult dr = new DialogResult();
                dr = dialog.ShowDialog();
                if (dr == DialogResult.OK)
                {
                    pictureBox3.Image = new Bitmap(dialog.FileName);
                }
                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }  
        }

        private void button3_Click(object sender, EventArgs e)
        {
            con.OpenConnection2();
            string query2 = "update tabla set (Slika) values (@Blob)";
            cmd.Connection = Connectioncl.connection2;
            cmd.CommandText = query2;
            cmd.Parameters.AddWithValue("Blob", save(pictureBox3));
            cmd.ExecuteNonQuery();
            MessageBox.Show("Data Save in Database ", "Data Save", MessageBoxButtons.OK, MessageBoxIcon.Information);
            pictureBox2.Image = pictureBox3.Image;
            this.Refresh();
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            if (panel3.Visible = !panel3.Visible)
            {
                panel3.Visible = panel3.Visible;
            }
            else if(panel3.Visible = panel3.Visible)
            {
                panel3.Visible = !panel3.Visible;
            }
        }
    }
}
 

Спасибо за любую помощь!!

Обновить

Поэтому я решил вставить полные данные и изображение непосредственно в таблицу в phpmyadmin, и когда я ввел учетные данные, ошибок не было.

Кажется, что это просто ошибка при преобразовании в blob при обновлении таблицы, теперь, если кто-нибудь может мне помочь с этим, я довольно новичок в C # и особенно в MySQL. [1]: https://i.stack.imgur.com/KUK7a.png

ОБНОВЛЕНИЕ # 2

Я изменил mstr.GetBuffer() в mstr.getArray(), также я добавил несколько строк в код, и ошибок при сохранении изображения больше нет, но у меня все еще возникают проблемы, когда оно сохраняется поврежденным или просто неправильно преобразуется.

Когда изображение загружается, оно занимает не так много памяти, как то же изображение, которое я вставил непосредственно в таблицу, у которой не было проблем с загрузкой в программу.

Так что теперь это просто проблема с преобразованием в двоичный файл! думаю, любая помощь приветствуется!

Вот как выглядит код после того, как я добавил пару строк для кнопки сохранения:

 private void button3_Click(object sender, EventArgs e)
        {
                byte[] ImageData;
                FileStream fs = new FileStream(fname, FileMode.Open, FileAccess.Read);
                BinaryReader br = new BinaryReader(fs);
                ImageData = br.ReadBytes((int)fs.Length);
                br.Close();
                fs.Close();  

                con.OpenConnection2();
                string query2 = "update tabla set Slika = '"   ImageData   "' where ID = '"   ID   "'";
                cmd.Connection = Connectioncl.connection2;
                cmd.CommandText = query2;
                cmd.Parameters.AddWithValue("Slika", ImageData);
                cmd.ExecuteNonQuery();
                MessageBox.Show("Data Save in Database ", "Data Save", MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.Refresh();
                con.CloseConnection2();   
        }
 

Комментарии:

1. Сначала вам нужно использовать правильный синтаксис инструкции Update. dev.mysql.com/doc/refman/8.0/en/update.html

2. Не используйте MemoryStream.GetBuffer() , используйте MemoryStream.ToArray() . Последний вернет только записанные в него байты, первый вернет дополнительные нулевые байты в конце. Не говорю, что это проблема, но даже так.

3. Вы сохраняете выходные pb.Image.RawFormat данные, длина которых составляет около 55 байт (включая CRLF), формат RawFormat не содержит изображения.

4. @LasseV.Karlsen, спасибо за помощь, я уже это сделал.

5. @Luuk что мне тогда использовать? можете ли вы привести мне пример

Ответ №1:

Я рад сообщить, что проблема была устранена, это действительно была проблема с сохранением изображения в базе данных.

Проблема заключалась в том, что мне пришлось добавить параметр MySqlDbType.Blob вот так:

cmd.Parameters.Add(«@Slika», MySqlDbType.Blob);

И затем я должен был дать этому параметру изображение, вот так:

cmd.Parameters[«@Slika»].Value = ImageData;

Как это просто, гораздо полезнее, когда вы решаете проблему самостоятельно: D

Я опубликую весь код, поэтому, если кто-то захочет его использовать, не стесняйтесь.

Код:

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
using System.IO;

namespace Maturski_Rad_1
{
    public partial class Form2 : Form
    {
        Connectioncl con = new Connectioncl();
        MySqlCommand cmd = new MySqlCommand();
        string ID = Form1.id;
        string fname;

        public Form2()
        {
            InitializeComponent();
        }

        public Image displayImage(byte[] slika)
        {

            MemoryStream mstr = new MemoryStream(slika);
            return Image.FromStream(mstr);
        }  

        private void Form2_Load(object sender, EventArgs e)
        {
            try
            {
                textBox1.Text = Form1.id; //just to check if its the correct ID
                con.OpenConnection();
                label1.Text = Form1.ime;
                label2.Text = Form1.prezime;
                timer1.Start();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

                try { 
                string query = "select Slika,ID from tabla where ID='"   ID   "'";
                cmd.Connection = Connectioncl.connection;
                cmd.CommandText = query;
                MySqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    pictureBox2.Image = displayImage((byte[])dr["Slika"]);

                }
                dr.Close();
                con.CloseConnection();
            }
            catch
            {
                MessageBox.Show("Error: Profilna slika nije pronadjena!");
            }
            
        }


        private void toolTip1_Popup(object sender, PopupEventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void panel1_MouseHover(object sender, EventArgs e)
        {
            toolTip1.Show("Vas ID je: "   Form1.id, panel1);
            toolTip1.UseFading = true;
        }

        private void label3_Click(object sender, EventArgs e)
        {

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            label4.Text = DateTime.Now.ToShortTimeString();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                OpenFileDialog dialog = new OpenFileDialog();
                dialog.Title = "Odaberite sliku";
                dialog.Filter = " (*.jpg;*.png;*.jpeg) | *.jpg;*.png;*.jpeg";
                DialogResult dr = new DialogResult();
                dr = dialog.ShowDialog();
                if (dr == DialogResult.OK)
                {
                    pictureBox3.Image = new Bitmap(dialog.FileName);
                    fname = dialog.FileName; 
                }
                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }  
        }

        private void button3_Click(object sender, EventArgs e)
        {
                byte[] ImageData;
                FileStream fs = new FileStream(fname, FileMode.Open, FileAccess.Read);
                BinaryReader br = new BinaryReader(fs);
                ImageData = br.ReadBytes((int)fs.Length);
                br.Close();
                fs.Close();  

                con.OpenConnection2();
                string query2 = "update tabla set Slika= @Slika where ID = '"   ID   "'";
                cmd.Connection = Connectioncl.connection2;
                cmd.CommandText = query2;
                cmd.Parameters.Add("@Slika", MySqlDbType.Blob);
                cmd.Parameters["@Slika"].Value = ImageData;
                cmd.ExecuteNonQuery();
                MessageBox.Show("Data Save in Database ", "Data Save", MessageBoxButtons.OK, MessageBoxIcon.Information);
                con.CloseConnection2();
                pictureBox2.Image = pictureBox3.Image;
            
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            pictureBox3.Image = pictureBox2.Image;

            if (panel3.Visible = !panel3.Visible)
            {
                panel3.Visible = panel3.Visible;
            }
            else if(panel3.Visible = panel3.Visible)
            {
                panel3.Visible = !panel3.Visible;
            }
        }
    }
}
 

Наслаждайтесь!

PS. Slika или @Slika означает изображение на моем языке, просто я так назвал свой столбец изображения в базе данных.