简体   繁体   English

从MySQL数据库将图像另存为BLOB时参数无效

[英]Parameter not valid when getting Image saved as BLOB from MySQL Database

I'm trying to get images saved in MySQL database as BLOB images into a picture box in my Windows application. 我试图将保存为MySQL数据库的图像作为BLOB图像保存到Windows应用程序的图片框中。

This is my code. 这是我的代码。

private Image GetFaceFromDB()
    {

    Image fetchedImage;

        if (rowNumber >= 0)
        {
            byte[] faceTobyte = (byte[])dataTable.Rows[rowNumber] 
            ["Image"];
            MemoryStream stream = new MemoryStream(faceTobyte);
            fetchedImage = Image.FromStream(stream); **//Error at this 
            line**
            return fetchedImage;
        }else
            {
                MessageBox.Show("There are no images in thedatabase,please 
                insert images.");
                return null;
            }
      }

This is the button click event 这是按钮单击事件

 private void btnFirst_Click(object sender, EventArgs e)
    {
    RefreshDBConnection();

    rowNumber = 0;
    pbTrainingSetImages.Image = GetFaceFromDB();
    tbUpdateFaceName.Text = dataTable.Rows[rowNumber]["Name"].ToString();
    lbFaceNumber.Text = (rowNumber + 1).ToString();
    if(pbTrainingSetImages.Image != null)
    {
        MessageBox.Show("You have reached the First image in the 
    database!");
    }

    }

I have also tried the following code 我也尝试了以下代码

A 一种

private void btnFirst_Click(object sender, EventArgs e)
   {

        RefreshDBConnection();
        rowNumber = 0;
        pbTrainingSetImages.Image = GetFaceFromDB();
        tbUpdateFaceName.Text = dataTable.Rows[rowNumber] 
 ["Name"].ToString();
        lbFaceNumber.Text = (rowNumber + 1).ToString();
        if(pbTrainingSetImages.Image != null)
        {
            MessageBox.Show("You have reached the First image in the 
        database!");
        }

   }

B

 private Image GetFaceFromDB()
        {

            Image fetchedImage;

            if (rowNumber >= 0)
            {
            byte[] faceTobyte= (byte[])dataTable.Rows[rowNumber["Image"];
                MemoryStream stream = new MemoryStream();
                stream.Position = 0;
                return fetchedImage = Image.FromStream(stream, false);
            }
            else
            {
                MessageBox.Show("There are no images in the database, please 
     insert 
                images.");
                return null;
            }
        }

C C

  private Image GetFaceFromDB()
        {

        Image fetchedImage;

        if (rowNumber >= 0)
        {
          byte[] faceTobyte = (byte[])dataTable.Rows[rowNumber]["Image"];
            MemoryStream stream = new MemoryStream();
            stream.Position = 0;
            return fetchedImage = Image.FromStream(stream, false);
        }
        else
        {
        MessageBox.Show("There are no images in the database,please insert 
            images.");
            return null;
        }
       }

D d

private Image GetFaceFromDB()
       {

            Image fetchedImage;

            if (rowNumber >= 0)
            {
                byte[] faceTobyte = (byte[])dataTable.Rows[rowNumber] 
                ["Image"];
                using(var stream = new  MemoryStream(faceTobyte))
                {
                    fetchedImage = Image.FromStream(stream);
                    return fetchedImage;
                }

            }
            else
            {
              MessageBox.Show("There are no images in the database, please 
                insert images.");
                return null;
            }
        }

I've also tried most of the answers provided in these Stack Overflow links: 我还尝试了这些堆栈溢出链接中提供的大多数答案:

This is the error message Parameter not valid at this line 这是错误消息参数在此行无效

fetchedImage = Image.FromStream(stream);

在此处输入图片说明

This is my Insert statement 这是我的插入语句

 private void AddFacesToDB(Image inputImage, string inputLabel)
    {
    if (connection.State.Equals(ConnectionState.Closed))
    {
        connection.Open();
    }

    try
    {
        //convert the face image to byte format for storing in db
        byte[] facesToByte = ConvertFaceToDBFormat(inputImage);
        totalRows++;

        //At what location is the image being stored to
        MessageBox.Show($"Adding row {totalRows.ToString()}");

        //inserting the image into the row 
        MySqlCommand insertCommand = new MySqlCommand("insert into 
     testimages.image_information(FaceID, FaceNo, Name, Image) values('" + 
       totalRows.ToString() + "','" + totalRows.ToString() + "', '" + 
       tbSetFaceLabel.Text + "', @IMG)", connection);

        MySqlParameter imageParam = 
       insertCommand.Parameters.AddWithValue("@IMG","Image");
        imageParam.Value = facesToByte;
        imageParam.Size = facesToByte.Length;
        int rowAffected = insertCommand.ExecuteNonQuery();
        MessageBox.Show("Data Stored Successfully in " + 
        rowAffected.ToString() + " Rows");

    }catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    finally
    {
        RefreshDBConnection();
    }

    }

This is my database 这是我的数据库

在此处输入图片说明

I finally solved it. 我终于解决了。 After spending 6 hours. 经过6个小时。 Persistence pays. 坚持不懈付出。 It was my Insert statement that the problem lied, 这是我的插入声明,该问题的所在,

byte[] faceTobyte = (byte[])dataTable.Rows[rowNumber]["Image"];

I kept parsing "Image" into byte not knowing I wasn't parsing a valid image format. 我一直将“图片”解析为字节,不知道自己没有解析有效的图片格式。 So I edited the my insert statement to this: 所以我编辑了我的插入语句:

//At what location is the image being stored to
            MessageBox.Show($"Adding row {totalRows.ToString()}");

            //inserting the image into the row 
        MySqlCommand insertCommand = new MySqlCommand("insert into testimages.image_information(FaceID, FaceNo, Name, Image) 
            values(@faceid, @faceno, @name, @img)", connection);

            MySqlParameter imageParam;
            insertCommand.Parameters.Add("@faceid", MySqlDbType.Int16,25);
           insertCommand.Parameters.Add("@faceno", MySqlDbType.Int16, 25);
          insertCommand.Parameters.Add("@name", MySqlDbType.VarChar, 25);
            insertCommand.Parameters.Add("@img", MySqlDbType.Binary);

        insertCommand.Parameters["@faceid"].Value = totalRows.ToString();
        insertCommand.Parameters["@faceno"].Value = totalRows.ToString();
            insertCommand.Parameters["@name"].Value = tbSetFaceLabel.Text;
            insertCommand.Parameters["@img"].Value = facesToByte;
            int rowAffected = insertCommand.ExecuteNonQuery();
            MessageBox.Show("Data Stored Successfully in " 
            + rowAffected.ToString() + " Rows");

Now, the correct image format is being passed and the image displays in the picture box. 现在,正在传递正确的图像格式,并且图像显示在图片框中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM