Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 31.10.2022
Сообщений: 9

Добавление изображения в таблицу MS SQL

28.04.2023, 20:05. Показов 1091. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
У меня еcть приложение на c# winforms
В datagridview вывожу таблицу из бд. Необходимо при нажатии на любую из строк выводить в picturebox изображение, хранящееся в базе данных. Достаю изображение по id. Вроде справился с этим, НО!
При выполнении программы возникает исключение "Недопустимый параметр" в строке pictureBox1.Image = Image.FromStream(memoryStream);

Может быть, кто-нибудь сталкивался с подобным? Помогите

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 string request = $"select formula from subs_img where id = {row.Cells[0].Value}";
                var command = new SqlCommand(request, database.getConnection());
                SqlDataReader reader = command.ExecuteReader();
                reader.Read();
 
                if (reader.HasRows)
                {
                    byte[] image = (byte[])(reader[0]);
            
                    if (image == null)
                        pictureBox1.Image = null;
                    else
                    {
                        MemoryStream memoryStream = new MemoryStream();
                        pictureBox1.Image = Image.FromStream(memoryStream);
                    }
                }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.04.2023, 20:05
Ответы с готовыми решениями:

Добавление изображения в бд sql server
В общем такая ситуация. У меня ИС "Агенство недвижимости"(диплом). По заданию нужно к каждому объекту привязать фото. Реализация интерфейса...

Добавление в таблицу MS SQL. Ошибка
Не могу решить ошибку "Символьные или двоичные данные могут быть усечены. Выполнение данной инструкции было прервано." У...

SQL. Добавление в таблицу записи
Подскажите пожалуйста. У меня есть программа что-то типа "интернет магазина" мне нужно при покупки товара что б название и цена товара...

11
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
29.04.2023, 00:24
tapok20, так вы же пустой MemoryStream передаете. Нужно передать массив image в конструктор MemoryStream.
0
0 / 0 / 0
Регистрация: 31.10.2022
Сообщений: 9
29.04.2023, 12:19  [ТС]
Та же ошибка

C#
1
2
3
4
5
6
7
8
9
10
11
12
 if (reader.HasRows)
                {
                    byte[] image = (byte[])(reader[0]);
            
                    if (image == null)
                        pictureBox1.Image = null;
                    else
                    {
                        MemoryStream memoryStream = new MemoryStream(image);
                        pictureBox1.Image = Image.FromStream(memoryStream);
                    }
                }
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
29.04.2023, 12:49
tapok20, значит в массиве неверные данные. Кто и как записывает туда данные?

P.S. Еще я бы немного изменил код чтения

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const string request = "select formula from subs_img where id = @id";
var command = new SqlCommand(request, database.getConnection());
command.Parameters.AddWithValue("@id", row.Cells[0].Value);
SqlDataReader reader = command.ExecuteReader();
if (reader.Read())
{
    byte[] image = reader.IsDBNull(0) ? null : (byte[])reader[0];
 
    if (image == null)
        pictureBox1.Image = null;
    else
    {
        MemoryStream memoryStream = new MemoryStream(image);
        pictureBox1.Image = Image.FromStream(memoryStream);
    }
}
1
0 / 0 / 0
Регистрация: 31.10.2022
Сообщений: 9
29.04.2023, 13:01  [ТС]
Всё равно ругается на ту же самую строчку. Возможно, я неправильно изображение сохраняю в базу?
Хранятся они в типе данных varbinary(max) в двоичном виде
Сохраняю с помощью SQL-запроса, по-другому не нашел как это сделать
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
29.04.2023, 13:04
Цитата Сообщение от tapok20 Посмотреть сообщение
Всё равно ругается на ту же самую строчку.
Я и не говорил что этот код исправит ошибку.

Цитата Сообщение от tapok20 Посмотреть сообщение
Возможно, я неправильно изображение сохраняю в базу?
Возможно.

Цитата Сообщение от tapok20 Посмотреть сообщение
Сохраняю с помощью SQL-запроса,
Показывайте как вы это делаете.
1
0 / 0 / 0
Регистрация: 31.10.2022
Сообщений: 9
29.04.2023, 13:52  [ТС]
SQL
1
INSERT INTO subs_img (formula) VALUES ('D:\путь к файлу\myProject\bin\Debug\imgs\4.jpg');
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
29.04.2023, 14:16
Цитата Сообщение от tapok20 Посмотреть сообщение
INSERT INTO subs_img (formula) VALUES ('D:\путь к файлу\myProject\bin\Debug\imgs\4.jpg');
Ух.... окей, все такими были. Грубо говоря вы сохраняете не файл, а исключительно текстовое значение пути к файлу. В целом такой подход тоже практикуют (правда больше в web). Вам же нужно:
- считать файл в byte[]
- сохранить этот массив в БД

(не) плохой пример можно глянуть тут

Note: лучше используйте File.ReadAllBytes(filename), т.к. Read читает секторами по 4кб.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True";
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        SqlCommand command = new SqlCommand();
        command.Connection = connection;
        command.CommandText = @"INSERT INTO Images VALUES (@FileName, @Title, @ImageData)";
        command.Parameters.Add("@FileName", SqlDbType.NVarChar, 50);
        command.Parameters.Add("@Title", SqlDbType.NVarChar, 50);
        command.Parameters.Add("@ImageData", SqlDbType.Image, 1000000);
 
        // путь к файлу для загрузки
        string filename = @"C:\Users\Eugene\Pictures\cats.jpg";
        // заголовок файла
        string title = "Коты";
        // получаем короткое имя файла для сохранения в бд
        string shortFileName = filename.Substring(filename.LastIndexOf('\\')+1); // cats.jpg
 
        // массив для хранения бинарных данных файла
        byte[] imageData = File.ReadAllBytes(filename);
 
        // передаем данные в команду через параметры
        command.Parameters["@FileName"].Value = shortFileName;
        command.Parameters["@Title"].Value = title;
        command.Parameters["@ImageData"].Value = imageData;
 
        command.ExecuteNonQuery();
    }
Более кошерный подход через FileTable
0
0 / 0 / 0
Регистрация: 31.10.2022
Сообщений: 9
29.04.2023, 14:36  [ТС]
Спасибо!
А подскажите, например, через запрос в самом SQL Server можно как-то преобразовать картинку и добавить её в бд?
Просто у меня в приложении не предусмотрено добавление через интерфейс
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
29.04.2023, 16:30
Лучший ответ Сообщение было отмечено tapok20 как решение

Решение

Цитата Сообщение от tapok20 Посмотреть сообщение
через запрос в самом SQL Server можно как-то преобразовать картинку и добавить её в бд?
T-SQL
1
2
INSERT INTO subs_img (formula)
  SELECT * FROM OPENROWSET (BULK 'D:\путь к файлу\myProject\bin\Debug\imgs\4.jpg', SINGLE_BLOB) AS B
Добавлено через 22 секунды
Цитата Сообщение от tapok20 Посмотреть сообщение
Просто у меня в приложении не предусмотрено добавление через интерфейс
Может стоит добавить?

Добавлено через 27 секунд
И совет выше сработает только когда файл и SQL Server находятся на одной машине.
1
0 / 0 / 0
Регистрация: 31.10.2022
Сообщений: 9
29.04.2023, 16:49  [ТС]
Спасибо! Теперь всё работает
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
29.04.2023, 20:46
Цитата Сообщение от OwenGlendower Посмотреть сообщение
И совет выше сработает только когда файл и SQL Server находятся на одной машине.
Что-то мне подсказывает что даже будучи на одной машине, будут проблемы. Например с папкой Picture юзера, по умолчанию sql разворачивается не с правами админа, и не имеет полного доступа ко всем файлам/каталогам.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.04.2023, 20:46
Помогаю со студенческими работами здесь

Добавление строки в таблицу SQL
Делаю так: public void SendOneBookToDB(Book book) { using (var con = new SqlCeConnection(connectionString)) { con.Open(); ...

Добавление данных в таблицу sql
Здравствуйте, подскажите пожалуйста в чем я ошибся <body> <?php $mysql_username="root"; $mysql_password=""; ...

SQL Добавление записей в таблицу
Почему в запросе несоответствие типов? insert into JurLocalSummGroup select FIO, TelNum, Tarif, Sum(LocalOne),Sum(LocalTwo),...

Добавление данных в таблицу SQL
Всем привет вот была сделана программа для работы с бд sql , но проблема в том что не могу внести данные в сам сервер. Пробовал через...

SQL запрос на добавление строки в таблицу
MySql_ls_seve("INSERT INTO Тип VALUES(4, 'новыйТип')"); public void MySql_ls_seve(string Command_Text) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru