Как получить изображение из базы данных MySQL, используя C# - PullRequest
1 голос
/ 04 апреля 2020

Я пытаюсь получить изображение при загрузке формы с помощью команды функции, но оно не загружается, и я получаю сообщение об ошибке «Параметр недействителен». Пожалуйста, проверьте, где я ошибаюсь в коде, потому что я пытался отлаживать свой код с помощью точек останова, и он показывает мне, что код работает нормально, но где-то изображение не извлекается из базы данных в графическое окно.

Вот мой код:

public static Bitmap ByteToImage(byte[] blob)
{
        MemoryStream mStream = new MemoryStream();
        byte[] pData = blob;
        mStream.Write(pData, 0, Convert.ToInt32(pData.Length));
        Bitmap bm = new Bitmap(mStream, false);
        mStream.Dispose();
        return bm;
}

Получить изображение с помощью функции Photoload:

public void photoLoad()
{
        ConnectionDB cnn = new ConnectionDB();

        string query1 = "select image from doctor_image where do='" + DoctorPanel.drUsername + "'";

        try
        {
            cnn.Open();
            MySqlDataReader row;
            row = cnn.ExecuteReader(query1);

            while (row.Read())
            {
                ImageByte = (Byte[])(row["image"]);
            }

            if (ImageByte != null)
            {
                // You need to convert it in bitmap to display the image
                pictureBox1.Image = ByteToImage(ImageByte);
                pictureBox1.Refresh();
            }
        }
        catch (Exception ex)
        {
           MessageBox.Show(ex.Message);
        }
}

Вставить в базу данных

private void Button6_Click(object sender, EventArgs e)
{
        OpenFileDialog open = new OpenFileDialog();

        // image filters  
        open.Filter = "Image Files(*.jpg; *.jpeg; *.gif; *.bmp)|*.jpg; *.jpeg; *.gif; *.bmp";

        if (open.ShowDialog() == DialogResult.OK)
        {
            // display image in picture box  
            //pictureBox1.Image = new Bitmap(open.FileName);
            pictureBox1.Image = Image.FromFile(open.FileName);

            ConnectionDB cnn = new ConnectionDB();
            cnn.Open();

            string sql = "INSERT INTO doctor_image(image, do) VALUES('" + pictureBox1.Image + "','" + DoctorPanel.drUsername + "')";
            int noofrows = cnn.ExecuteNonQuery(sql);

            if (noofrows != -1)
            {
                MessageBox.Show("Photo uploaded");
            }
            else
            {
                MessageBox.Show("Data insert error");
            }
        }
}

1 Ответ

0 голосов
/ 04 апреля 2020

Эта строка кода неверна:

string sql = "INSERT INTO doctor_image(image, do) VALUES('" + pictureBox1.Image + "','" + DoctorPanel.drUsername + "')";

Во-первых, вы используете конкатенацию строк для построения SQL. Это распространенный источник проблем безопасности (в частности, SQL инъекция). Вместо этого используйте параметры.

Во-вторых, "'" + pictureBox1.Image + "','" просто выведет строку, похожую на 'System.Drawing.Bitmap', которая будет вставлена ​​в вашу базу данных. Очевидно, это недопустимое изображение, поэтому при попытке загрузить его вы получаете исключение «Параметр не действителен».

Похоже, вы просто хотите вставить байты изображения в базу данных. , который имеет простое исправление. Вам даже не нужно использовать класс Image; просто прочитайте байты файла и загрузите их в таблицу:

using (var cmd = new MySqlCommand(@"INSERT INTO doctor_image(image, do) VALUES(@image, @do);", cnn)
{
    cmd.Parameters.AddWithValue("@image", File.ReadAllByes(open.FileName));
    cmd.Parameters.AddWithValue("@do", DoctorPanel.drUsername);
    cmd.ExecuteNonQuery();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...