C# Сохранение изображения в базе данных (не работает)

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

 public void AddSong(string names, string artists, string bands, string album, string strFilePath, string strlyrics, string strmp3)
    {


        if (strFilePath != null)
        {
            Image temp = new Bitmap(strFilePath);
            MemoryStream strm = new MemoryStream();
            temp.Save(strm, System.Drawing.Imaging.ImageFormat.Jpeg);
            ImageByteArray = strm.ToArray();
        }

        SqlConnection con = new SqlConnection(ConnectionString);

        //SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\Ruben\Documents\dbPlatenCompany.mdf;Integrated Security = True; Connect Timeout = 30");
        string query = "INSERT INTO [tblSongs] ([Name], [Artist], [Band], [Album], [Cover], [lyrics], [mp3]) VALUES ('" + names + "','" + artists + "','" + bands + "','" + album + "', @IMG,'" + strlyrics + "','" + strmp3 + "')";
        SqlCommand cmd = new SqlCommand(query, con);

        try
        {
            con.Open();
            cmd.Parameters.Add(new SqlParameter("@IMG", ImageByteArray));
            cmd.BeginExecuteNonQuery();
            MessageBox.Show("gelukt");

        }

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

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

Кстати, у вас есть уязвимость SQL-инъекции. Чтобы этого избежать, используйте параметры SQL.

dymanoid 17.12.2018 17:56

Хранить изображения в базе данных - не лучшая идея. Вместо этого загрузите изображение и сохраните URL-адрес или расположение файла изображения.

H. Pauwelyn 17.12.2018 18:06

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

Boy pro 17.12.2018 18:09

Попробуйте использовать ExecuteNonQuery вместо BeginExecuteNonQuery. Если вам нужна асинхронная обработка, вы также должны использовать EndExecuteNonQuery или лучше использовать более новую версию на основе задач ExecuteNonQueryAsync.

H.G. Sandhagen 17.12.2018 18:09

Это + + не + было + + правильным + способом + составления + SQL в течение очень долгого времени. Это утомительно, трудно читать и очень подвержено ошибкам. Всегда используйте параметры SQL

Ňɏssa Pøngjǣrdenlarp 17.12.2018 18:33

Попробуйте: c-sharpcorner.com/UploadFile/e628d9/…

Ali NajafZadeh 08.08.2021 19:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
2 442
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Объявите параметр, имеющий тип Image или VarBinary и длину, достаточную для его хранения. Вы также можете попробовать объявить длину параметра равной 0 ..

cmd.Parameters.Add("@IMG", SqlDbType.Image, ImageByteArray.Length).Value =  ImageByteArray);
cmd.Parameters.Add("@IMG", SqlDbType.VarBinary, ImageByteArray.Length).Value =  ImageByteArray);

Обратите внимание, что SqlDbType.Image не имеет ничего общего с данными изображения (png, jpeg и т. д.) - это SQLServer означает «до 2 гигабайт двоичных данных». Вы можете сохранить файл MP3, Word и т. д. В параметре типа изображения.

Вам следует подумать о параметризации и других переменных, пока вы занимаетесь этим ...

Обновлено: обратите внимание на ресурс, связанный в комментарии, и рассмотрите возможность НЕ хранить эти данные в двоичном столбце вообще

Тип данных изображения также устарел, см. stackoverflow.com/questions/444072/…. И SqlConnection может находиться в используемом блоке (для своевременного удаления).

Polyfun 17.12.2018 17:58

Большое спасибо, я плохо разбираюсь в этом, я новичок в работе с базами данных. Но, похоже, это не решает проблему для меня.

im_ Ruben 17.12.2018 17:59
Ответ принят как подходящий

См. Код ниже. Я надеюсь, что это поможет - (я только добавил код для сохранения изображения в БД)

        FileStream fs = new FileStream(selectedFile, FileMode.Open, FileAccess.Read);
        byte[] bimage = new byte[fs.Length];
        fs.Read(bimage, 0, Convert.ToInt32(fs.Length));

        SqlConnection cn;
        cn = new SqlConnection("Data Source=.;Initial Catalog=TestDB;Integrated 
        Security=True");
        cn.Open();
        SqlCommand cmd = new SqlCommand("insert into MyTable (Image) 
        values(@imgdata)", cn);
        cmd.Parameters.AddWithValue("@imgdata", SqlDbType.Image).Value = bimage;
        cmd.ExecuteNonQuery();
        cn.Close();

Другие вопросы по теме