Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
ARhi
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 13
1

Ввод картинки в базу SQL Server и превышение длины строки

22.12.2016, 11:15. Просмотров 1041. Ответов 19
Метки нет (Все метки)

Здравствуйте, возникла такая проблема.
При попытке ввести картинку кодом

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
OpenFileDialog opf = new OpenFileDialog();
            if (opf.ShowDialog() == DialogResult.OK)
            {
                bmp = new Bitmap(opf.FileName);
                pictureBox1.Image = bmp;
            }
            using (SqlConnection conn = new SqlConnection(connection_string))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand("INSERT INTO WaterMark(id,[image]) VALUES (1,@img)", conn);
                cmd.Parameters.Add("@img", SqlDbType.VarBinary); 
                MemoryStream ms = new MemoryStream();               
                bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                cmd.Parameters["@img"].Value = ms.ToArray();
                cmd.ExecuteNonQuery();
                conn.Close();
            }
Выскакивает ошибка
: Не удалось создать строку размером 8081, который превышает допустимый размер, равный 8060.

В самой базе, столбец image имеет тип данных VarBinary(MAX)

Не понимаю как избавиться от проблемы. Помогите.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2016, 11:15
Ответы с готовыми решениями:

Добавление картинки в sql базу
Такой вопрос, у меня на форме есть picturebox. И есть sql server база, в ней...

Экспорт из Exel в базу данных SQL Server
Есть таблица из пяти колонок в Excel. Мне нужно импортить эти записи программно...

SQL Server Compact пересоздать базу данных
Есть приложение Win Forms .NET использующее базу данных на MS SQL Server...

Программно присоединить базу данных SQL SERVER
Всем привет. Создал проектик в Visual Studio, который работает с базой SQL...

Создать запрос INSERT в базу SQL Server
connect.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data...

19
1231231ghacking
98 / 102 / 62
Регистрация: 19.11.2015
Сообщений: 380
Завершенные тесты: 3
22.12.2016, 11:30 2
Можно попробовать хранить изображение не в виде байтов, а в виде Base64, а при надобности обратно из Base64 в изображение конвертировать)
0
ARhi
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 13
22.12.2016, 12:01  [ТС] 3
1231231ghacking, а что это за Base64?
0
Usaga
Эксперт .NET
5279 / 3583 / 626
Регистрация: 21.01.2016
Сообщений: 14,275
Завершенные тесты: 2
22.12.2016, 12:59 4
Цитата Сообщение от ARhi Посмотреть сообщение
а что это за Base64?
Можно было бы и погуглить....
0
ARhi
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 13
22.12.2016, 14:50  [ТС] 5
Еще варианты есть?
0
Usaga
Эксперт .NET
5279 / 3583 / 626
Регистрация: 21.01.2016
Сообщений: 14,275
Завершенные тесты: 2
22.12.2016, 14:57 6
ARhi, у MSSQL есть специальный тип колонки - image. Используй его.
0
ARhi
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 13
22.12.2016, 15:06  [ТС] 7
Usaga, Пробовал. тоже самое.
0
pincet
1368 / 952 / 130
Регистрация: 23.07.2010
Сообщений: 5,159
22.12.2016, 16:02 8
хранить ссылку на изображение не предлагать?
0
Usaga
Эксперт .NET
5279 / 3583 / 626
Регистрация: 21.01.2016
Сообщений: 14,275
Завершенные тесты: 2
22.12.2016, 16:29 9
ARhi, что значит "тоже самое"? Код покажи, который безуспешно пытался в БД картинку сохранить.
0
Igr_ok
402 / 376 / 182
Регистрация: 04.08.2015
Сообщений: 1,043
22.12.2016, 17:38 10
Не усложняйте.
C#
1
2
3
4
5
6
7
8
9
using (SqlConnection conn = new SqlConnection(connection_string))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand("INSERT INTO WaterMark(id,[image]) VALUES (1,@img)", conn);
                cmd.Parameters.Add("@img", SqlDbType.VarBinary); 
                cmd.Parameters["@img"].Value = File.ReadAllBytes(opd.FileName);
                cmd.ExecuteNonQuery();
                conn.Close();
            }
1
ARhi
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 13
23.12.2016, 08:56  [ТС] 11
pincet, В данном случае нет

Usaga, "Тоже самое" значит, что результат тот же что и раньше. Единственное что менялось в коде, это строка
C#
1
cmd.Parameters.Add("@img", SqlDbType.VarBinary);
. Поменялась на
C#
1
cmd.Parameters.Add("@img", SqlDbType.Image);
.
Соответственно менялся тип столбца в базе.

Igr_ok, Попробовал вашим кодом, но результат все равно такой же. Но за упрощение кода спасибо))
0
Usaga
Эксперт .NET
5279 / 3583 / 626
Регистрация: 21.01.2016
Сообщений: 14,275
Завершенные тесты: 2
23.12.2016, 09:17 12
ARhi, при создании параметра, нужно указать и размер передаваемых данных
0
ARhi
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 13
23.12.2016, 09:50  [ТС] 13
Usaga, и так
C#
1
2
cmd.Parameters.Add("@img", SqlDbType.Image,8000);                    
                    cmd.Parameters["@img"].Value = File.ReadAllBytes(opf.FileName);
и так
C#
1
2
3
cmd.Parameters.Add("@img", SqlDbType.Image);                    
                    cmd.Parameters["@img"].Value = File.ReadAllBytes(opf.FileName);
                    cmd.Parameters["@img"].Size = 8000;
попробовал. Результат не меняется.
0
Igr_ok
402 / 376 / 182
Регистрация: 04.08.2015
Сообщений: 1,043
23.12.2016, 10:02 14
Цитата Сообщение от ARhi Посмотреть сообщение
Результат не меняется.
Нужно указывать весь размер вставляемого объекта.
C#
1
2
byte[] img= File.ReadAllBytes(opf.FileName);
cmd.Parameters.Add("@img", SqlDbType.Image, img.Length).Value = photo;
0
ARhi
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 13
23.12.2016, 10:25  [ТС] 15
Igr_ok, И все равно результат не меняется
0
Igr_ok
402 / 376 / 182
Регистрация: 04.08.2015
Сообщений: 1,043
23.12.2016, 10:33 16
ARhi, покажите, как сейчас выглядит код.
0
ARhi
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 13
23.12.2016, 10:58  [ТС] 17
Igr_ok,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            OpenFileDialog opf = new OpenFileDialog();
            if (opf.ShowDialog() == DialogResult.OK)
            {                
                using (SqlConnection conn = new SqlConnection(connection_string))
                {
                    conn.Open();                    
                    SqlCommand cmd = new SqlCommand("INSERT INTO WaterMark(id,[image]) VALUES (1,@img)", conn);
 
                    byte[] img= File.ReadAllBytes(opf.FileName);
                    cmd.Parameters.Add("@img", SqlDbType.Image, img.Length).Value = img;
                    cmd.ExecuteNonQuery();
 
                    conn.Close();
                }
            }
0
Usaga
Эксперт .NET
5279 / 3583 / 626
Регистрация: 21.01.2016
Сообщений: 14,275
Завершенные тесты: 2
23.12.2016, 11:23 18
ARhi, зачем ты Id явно задаёшь? Так задумано?
0
Igr_ok
402 / 376 / 182
Регистрация: 04.08.2015
Сообщений: 1,043
23.12.2016, 11:32 19
Лучший ответ Сообщение было отмечено ARhi как решение

Решение

Проверил, код рабочий. Создал таблицу
SQL
1
2
3
4
5
6
7
8
CREATE TABLE [dbo].[Images](
    [id] [INT] IDENTITY(1,1) NOT NULL,
    [myImage] [image] NOT NULL,
 CONSTRAINT [PK_Images] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private void bOpen_Click(object sender, EventArgs e)
        {
            if(opf.ShowDialog()==DialogResult.OK)
            {
                using (SqlConnection conn = new SqlConnection("Data Source = IGR_OK; Initial Catalog = Test; Integrated Security = True"))
                {
                    conn.Open();
                    SqlCommand cmd = new SqlCommand("INSERT INTO Images([myImage]) VALUES (@img)", conn);
 
                    byte[] img = File.ReadAllBytes(opf.FileName);
                    cmd.Parameters.Add("@img", SqlDbType.Image, img.Length).Value = img;
                    cmd.ExecuteNonQuery();
 
                    conn.Close();
                }
            }
        }
1
ARhi
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 13
23.12.2016, 11:59  [ТС] 20
Usaga, это потому что id не был счетчиком.

Igr_ok, Спасибо. Не знаю что у меня там было, но перешел на вашу таблицу и все заработало.
0
23.12.2016, 11:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2016, 11:59

Ввод в SQL Server Compact 3.5
Добрый день. Сколько я не искал сколько не читал, но никак я не могу понять как...

Вставка decimal в базу данных SQL server из maskedTextBox
Уважаемые форумчане! Помогите разобраться. Уже третий день пытаюсь внести...

Как перенести базу данных с SQL server в проект
Добрый вечер участникам , вопрос следующего характера Создал в SQL SERVER...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru