Member 13043559 Ответов: 2

У меня есть проблема с обновлением данных blob-объекта изображения, не могли бы вы подсказать, что мне делать?


я обновляю данные, все поля обновляются, кроме изображения, оно показывает на дату base image = System.Байт, пожалуйста, помоги мне в этом.

Что я уже пробовал:

try 
{
    MemoryStream ms = new MemoryStream();
    Cat_Image.Image.Save(ms, Cat_Image.Image.RawFormat);
    byte[] img = ms.ToArray();
    string Query = "UPDATE `dish_category` SET Cat_Name='" + this.Cat_Name.Text + "',Cat_Image='" + img + "',Cat_Status='" + this.Cat_Status.Text + "' where Cat_ID='" + this.Cat_ID.Text + "';";
    cmd = new MySqlCommand(Query, conn);
    MySqlDataReader mydr;
    if (conn.State == ConnectionState.Closed)
    {
      conn.Open();
    }
    mydr = cmd.ExecuteReader();
    MessageBox.Show("Data Updated");
    while (mydr.Read())
    {
    }
    conn.Close(); 
}
catch (MySql.Data.MySqlClient.MySqlException ex)
{
    MessageBox.Show(ex.Message);
    conn.Close();
}

2 Ответов

Рейтинг:
2

F-ES Sitecore

Cat_Image='" + img


Здесь вы объединяете две строки, так что .net собирается преобразовать "img" в строку, так что вы действительно делаете это

Cat_Image='" + img.ToString()


когда вы просите объект преобразовать себя в строку, если нет конкретной реализации ToString, он просто возвращает имя типа, который находится там, где System.Байт идет откуда-то.

Вместо того чтобы использовать конкатенацию для построения SQL, используйте коллекцию параметров, гугля "ado.net update sql image" даст вам пример кода

Вставка изображения из файла[^]

В приведенном выше примере используйте обновление, а не вставку, но основной принцип тот же.


Рейтинг:
10

Jochen Arndt

Вы не можете передавать двоичные данные в строке запроса. Вместо этого вы должны использовать параметризованный запрос.

Непроверенный:

string Query = "UPDATE `dish_category` SET Cat_Name='@Name',Cat_Image='@Image',Cat_Status='@Status' where Cat_ID='@Id';";
MySqlCommand cmd = new MySqlCommand(Query, conn);
cmd.Parameters.AddWithValue("@Name", this.Cat_Name.Text;);
// Edit: Use Add() instead
//cmd.Parameters.AddWithValue("@Image", img);
cmd.Parameters.Add("@Image", SqlDbType.Blob, img.Length).Value = img;  
cmd.Parameters.AddWithValue("@Status", this.Cat_Status.Text);
cmd.Parameters.AddWithValue("@Id", this.Cat_ID.Text);
if (conn.State == ConnectionState.Closed)
{
    conn.Open();
}
command.ExecuteNonQuery(); 

Обратите внимание, что все значения всегда должны передаваться в качестве параметров для предотвращения SQL-инъекции.


Member 13043559

Я использую это решение , я получаю эту ошибку,

система.ArrumentException: параметр недопустим. в системе.Рисование.Изображение.FromStream(Stream stream, Boolean use EmbeddedColorManagement, Boolean validateImageData)

Jochen Arndt

Смотрите мой обновленный ответ.

Member 13043559

Да, теперь это работает, Спасибо тебе большое, приятель :) хорошего дня.