adsl club

Справочник

Форум

Программы

Фильмы

Ресурсы

Файлообмен

Хостинг

Ростелеком
Как с помощью чистого SQL вставлять битовые массивы (изображения и пр.) в БД?
Ответить на тему    Форум АДСЛ КлубаЦИФРОВОЙ ФЛЕЙМ :)ПРОГРАММИРОВАНИЕ
Автор Сообщение
AlexRock
Гуру
СообщениеДобавлено: Пн 24-05-10 : 12-35    Заголовок сообщения: Как с помощью чистого SQL вставлять битовые массивы (изображения и пр.) в БД? Ответить с цитатой

"Чистого" - без использования специальных классов создания запросов в каких-нибудь средах программирования, а используя только текстовые команды SQL, как будто из консоли работаешь. Можно вставить картинку одной командой? А группу картинок одной командой? Или текстовыми запросами можно только текстовые данные вставлять? А как же тогда работают эти конструкторы и классы запросов (например, в Visual Studio это SqlCommand и SqlCeCommand, в которых в их объекты надо добавлять параметры и вообще настраивать всякие навороты) в средах программирования? Они же всё равно в SQL всё это потом переводят, или нет? Или там как-то на конкретную СУБД и её функции всё завязано, и "чистым" SQL для вставки массивов битовых массивов (т. е. массивов изображений, например) не пользуются?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
Richard Ferlow
Гуру
Предупреждений : 2
СообщениеДобавлено: Пн 24-05-10 : 13-45    Заголовок сообщения: Ответить с цитатой

...ммм....в base64 кодировать и вставлять сколько влезет...
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
AlexRock
Гуру
СообщениеДобавлено: Пн 24-05-10 : 15-57    Заголовок сообщения: Ответить с цитатой

Ага, точно. Нашёл функции декодера base64 в дотНЕТ фреймворке.

А вот интересно, класс SqlCommand внутри себя их же использует, или что-то другое для вставки больших битовых массивов.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
Richard Ferlow
Гуру
Предупреждений : 2
СообщениеДобавлено: Пн 24-05-10 : 16-14    Заголовок сообщения: Ответить с цитатой

Не пойму я что-то сей сумбур. выбираешь тип данных, куда твоя картинка в кодированном виде влезет и туда этот код вставляешь. по сути это будет просто большой текст. хотя изображения в SQL хранить не комильфо...
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
AlexRock
Гуру
СообщениеДобавлено: Пн 24-05-10 : 16-39    Заголовок сообщения: Ответить с цитатой

Richard Ferlow
Да всё в порядке - я теперь разобрался уже. Мне просто интересно, как класс SqlCommand в дотНЕТ фреймворке заталкивает картинки в БД, и как СУБД (MS SQL Server) их отдаёт - в формате ли base64 или что-то своё.

Может, ты знаешь, в каком формате, например, та СУБД, с которой ты работаешь, возвращает картинки и тому подобные данные, если ей текстовым запросом SQL их запросить? Этим же base64?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
Richard Ferlow
Гуру
Предупреждений : 2
СообщениеДобавлено: Пн 24-05-10 : 16-46    Заголовок сообщения: Ответить с цитатой

Я работаю с MySQL

так вот, если в нее впихивать картинку предварительно закодировав ее в base64 - то вот таким кодом она там и будет я определенном столбце определенной строки лежать. т.е. типа INSERT ..... (...'$base64image'...)

если картинку надо вывести - то средствами PHP сначала декодируем, потом выводим содержание предварительно не забыв указать в заголовках скрипта что это - изображение.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение   Номер ICQ
AlexRock
Гуру
СообщениеДобавлено: Пн 24-05-10 : 17-28    Заголовок сообщения: Ответить с цитатой

А если картинку надо в бинарных данных хранить, то через текстовый интерфейс (чисто кодом SQL) её никак не запихать в БД и не вытащить оттуда? Я не знаю, может, там какие-то внутренние функции СУБД можно прямо в коде SQL вызывать, где указывать источник этих бинарных данных или что-то такое. Поэтому я и использовал класс SqlCommand - в нём в качестве параметров передаются источник данных в виде байтового массива, а байтовый массив раньше из картинки получал. Т. е. всю работу делает класс, а как он это делает - неясно. Вот я и спросил, что, может, он что-то тривиальное делает, типа кодирования в base64 или чего-то подобного.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
dipp
Эксперт
СообщениеДобавлено: Пн 24-05-10 : 17-42    Заголовок сообщения: Ответить с цитатой

AlexRock
Ну дык ты посмотри, что там в базе творится после sqlcommand. Увидишь - base64 там, или нет. У столбца какой типа данных вобще? В SQLite есть например BLOB (Binary Large OBject), который может хранить в себе любой бинарный код. Правда, через обычный "INSERT INTO ..." вставить в такой столбец нельзя, нужно использовать спец. функции интерфейса к базе (в случае С++ они так и называются: sqlite_blob_read, write). SqlCommand может быть тоже использует какие-то хитрости при прямом обращении к SQL. Используется MySQL или MS SQL?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
AlexRock
Гуру
СообщениеДобавлено: Пн 24-05-10 : 17-49    Заголовок сообщения: Ответить с цитатой

dipp писал(а):
Ну дык ты посмотри, что там в базе творится после sqlcommand. Увидишь - base64 там, или нет. У столбца какой типа данных вобще?

Тип данных image, но когда сами данные смотришь, то они binary. Вобщем, понятно, что SqlCommand как-то вставляет их бинарными, но я хотел узнать, как это делать в коде SQL. Вот ты сказал, что
dipp писал(а):
функции интерфейса к базе (в случае С++ они так и называются: sqlite_blob_read, write)

- это прямо в коде запроса можно писать, или через какую-то среду программирования, через какой-то фреймворк? Если в коде, то как источники данных указывать, вплоть до самих картинок, которые файлами лежат на диске, скажем?

Я к тому, что можно ли вообще абстрагироваться от всяких фреймворков и запихать (и получить) картинки в БД через только текстовый интерфейс, используя только механизмы самой СУБД и языка SQL, при этом не раскатывая в тексте каждую картинку в коде base64 или ещё каким-то геморным образом? В идеале, вызвать в запросе функцию, в которую передать параметры с именем файла и т. д. С другой стороны, как получить из БД массис картинок в запросе, чтобы потом их куда-то деть? В идеале тоже, например, функцию, в которой указываешь, что куда сохранять.

Есть такое в ваших СУБД, или нет?
dipp писал(а):
Используется MySQL или MS SQL?

MS.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
medal
Форумчанин
СообщениеДобавлено: Пн 24-05-10 : 20-03    Заголовок сообщения: Ответить с цитатой

Чтобы записать картинку либо бинарник в базу нужно указать заголовок "0x" и далее должно сделовать содержимое файла в hex.

Например
Код:
insert into TABLENAME(IMG_BIN) values(0x65DEFFE5E7...0FFFFF)


Справедливо для MSSQL.

Насколько я знаю, у MSSQL нет встроенной функции, которая возьмет содержимое файла из файловой системы. Но можно написать свою, используя, SQLCLR например. http://habrahabr.ru/blogs/sql/88396/

Зачем что-то кодировать в base64? Это не кошерно.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
AlexRock
Гуру
СообщениеДобавлено: Пн 24-05-10 : 20-10    Заголовок сообщения: Ответить с цитатой

medal писал(а):
Зачем что-то кодировать в base64? Это не кошерно.

Ну, что base64, что битовый массив с этим "0х..." - всё едино и всё неподходит, ибо не руками же мне в код запроса вставлять полмегабайта текста из буфера обмена. Shocked А если надо группу картинок за одну транзакцию вставить, а не по одной картинке? Вот и получается, что надо писать свой простенький редактор для вставки картинок, который будет юзать сторонние фреймворки, чтобы в БД вставлять и из неё забирать "трудные" данные. Эта SQLCLR - путь фреймворка.

Т. е., как я понял, стандарт SQL не предусматривает никаких удобных средсвт для вставки битовых массивов, которые (средства) бы всеми СУБД на уровне стандарта SQL бы поддерживались? Каждый производитель СУБД выкручивается по-своему?
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
medal
Форумчанин
СообщениеДобавлено: Пн 24-05-10 : 20-20    Заголовок сообщения: Ответить с цитатой

AlexRock
Задай вопрос не с конца. Как стоит исходная задача? T-SQL не предназначен для таких вещей. Решать нужно прикладную задачу.

Бинарные данные надо хранить как бинарные данные, а не как закодированные бинарные данные.

Тебе нужно писать простейшую утилиту, которая будет бинарные данные переводить в hex и записывать в базу. Соответственно, извлекая из базы, данные уже будут бинарные и нужно просто записать их в файл, ничего не перекодируя.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
medal
Форумчанин
СообщениеДобавлено: Пн 24-05-10 : 20-25    Заголовок сообщения: Ответить с цитатой

AlexRock писал(а):
Эта SQLCLR - путь фреймворка.


Используя эту технологию ты может написать модуль расширения для MSSQL, который будет содержать твою кастомную функцию, например "GetFileContent", подключив такой модуль ты сможешь из MSSQL выполнять следующий SQL код:

Код:

insert into TABLENAME(IMG_BIN) select dbo.GetFileContent("c:\путь\до\файла.jpg")


Расширив функцию, сможешь и массивы файлов записывать:

Код:

insert into TABLENAME(IMG_BIN) select dbo.GetFileContent("c:\путь\до\файлов\*.jpg")
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
AlexRock
Гуру
СообщениеДобавлено: Пн 24-05-10 : 20-36    Заголовок сообщения: Ответить с цитатой

medal
Да задача-то прикладная у меня решена уже - я просто делают свой редактор и вставляю руками (у меня ручное наполнение БД) либо по одной картинке, либо сразу всю директорию с картинками, и использую для этого либо классы SqlCommand, SqlCeCommand, либо LINQ. Я просто столкнулся с тем, что обычные небольшие текстовые данные и числа можно вставлять прямо через текстовый интерфейс SQL, а битовые массивы - только если писать вспомогательные вещи всякие, ибо руками вставлять замучаешься. Опять же, все эти упрощающие функции, которые можно потом вызывать в коде запроса, для каждой СУБД свои, а не общие для всех, которые бы были оговорены в стандарте SQL.

Вобщем, спасибо, я получил ответ на свой вопрос.
 Наверх
Посмотреть профиль / Отправить личное сообщение Отправить личное сообщение  
Показать сообщения:   
Ответить на тему    Форум АДСЛ КлубаЦИФРОВОЙ ФЛЕЙМ :)ПРОГРАММИРОВАНИЕ Часовой пояс: GMT + 7
Страница 1 из 1

 

 
Аватары: Вкл|Выкл   ЮзерИнфо: Вкл|Выкл   Подписи: Вкл|Выкл
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы можете скачивать файлы