Я хочу получить изображение из базы данных mysql, но произошла ошибка «системный параметр недопустим при системном рисовании изображения из потока ...» - PullRequest
0 голосов
/ 06 июля 2019

Это мой код:

try
{ 
    con = new MySqlConnection(conname);
    con.Open();
    //
    string query = " Select monday_img_slot1 from faculty_attend_record where idfaculty='"+id+"'";
    MySqlCommand cmd = new MySqlCommand(query, con);

    MySqlDataReader da = cmd.ExecuteReader();

    if(da.HasRows)
    {
        da.Read();
        byte[] img = (byte[])da[0];
        // error is in the line below 
        MemoryStream ms = new MemoryStream(img);
        captureImage.Image = Image.FromStream(ms);
    }

    con.Close();
}
catch (Exception e)
{
    MessageBox.Show(e.ToString());
}

1 Ответ

0 голосов
/ 08 июля 2019

Вы сохраняете путь изображения в базе данных (столбец monday_img_slot1) вместо фактического изображения. Необходимо сначала преобразовать изображение в байт, а затем сохранить его в базе данных.

Ниже приведена демонстрация загрузки изображения в базу данных (в столбце name = "images" и столбце "data" - longblob, "id" - int, "name" - строковый тип)

Примечание: вам нужно использовать подготовленный оператор, чтобы избежать внедрения MySQL.

MySqlConnection con=null;
try
{
    string myConnectionString = "server=localhost;database=test;uid=root;pwd=root;";
    OpenFileDialog openFileDialog1 = new OpenFileDialog();
    openFileDialog1.Filter = "Image files | *.jpg";
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {

        con = new MySqlConnection(myConnectionString);
        string FileName = openFileDialog1.FileName;
        FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read);
        BinaryReader br = new BinaryReader(fs);
        byte[] ImageData = br.ReadBytes((int)fs.Length);
        br.Close();
        fs.Close();
        string CmdString = "INSERT INTO images(id, name, data) VALUES(@id, @name, @data)";
        MySqlCommand cmd = new MySqlCommand(CmdString, con);
        cmd.Parameters.Add("@id", MySqlDbType.Int32);
        cmd.Parameters.Add("@name", MySqlDbType.VarChar, 45);
        cmd.Parameters.Add("@data", MySqlDbType.LongBlob);
        cmd.Parameters["@id"].Value = 5;
        cmd.Parameters["@name"].Value = textBox1.Text;
        cmd.Parameters["@data"].Value = ImageData;

        con.Open();
        int RowsAffected = cmd.ExecuteNonQuery();
        if (RowsAffected > 0)
        {
            MessageBox.Show("Image saved sucessfully!");
        }

    }
    else
    {
        MessageBox.Show("Incomplete data!", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}
finally
{
    if (con!=null && con.State == ConnectionState.Open)
    {
        con.Close();
    }
}

В вашем случае перед командой update конвертируйте изображение в байт:

MySqlConnection con=null;
try
{
    con = new MySqlConnection(conname);

    string captureimg = path;
    FileStream fs = new FileStream(captureimg, FileMode.Open, FileAccess.Read);
    BinaryReader br = new BinaryReader(fs);
    byte[] ImageData = br.ReadBytes((int)fs.Length);
    br.Close();
    fs.Close();
    string CmdString = "Update faculty_attend_record set monday_slot1=@monday_slot1,monday_img_slot1=@monday_img_slot1,monday_class_slot1=@monday_class_slot1,monday_room_slot1=@monday_room_slot1 where idfaculty=@idfaculty";

    MySqlCommand cmd = new MySqlCommand(CmdString, con);
    cmd.Parameters.Add("@monday_slot1", MySqlDbType.VarChar, 50);
    cmd.Parameters.Add("@monday_img_slot1", MySqlDbType.LongBlob);
    cmd.Parameters.Add("@monday_class_slot1", MySqlDbType.VarChar, 50);
    cmd.Parameters.Add("@monday_room_slot1", MySqlDbType.VarChar, 50);
    cmd.Parameters.Add("@idfaculty", MySqlDbType.VarChar, 50);
    cmd.Parameters["@monday_slot1"].Value = "present";
    cmd.Parameters["@monday_img_slot1"].Value = ImageData;
    cmd.Parameters["@monday_class_slot1"].Value = classname1.Text;
    cmd.Parameters["@monday_room_slot1"].Value = RoomNo1.Text;
    cmd.Parameters["@idfaculty"].Value = idfaculty;
    con.Open();
    int RowsAffected = cmd.ExecuteNonQuery();
    if (RowsAffected > 0)
    {
        MessageBox.Show("Image saved sucessfully!");
    }
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}
finally
{
    if (con!=null && con.State == ConnectionState.Open)
    {
        con.Close();
    }
}

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

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