Автор |
Сообщение |
AlexRock Гуру |
|
"Чистого" - без использования специальных классов создания запросов в каких-нибудь средах программирования, а используя только текстовые команды SQL, как будто из консоли работаешь. Можно вставить картинку одной командой? А группу картинок одной командой? Или текстовыми запросами можно только текстовые данные вставлять? А как же тогда работают эти конструкторы и классы запросов (например, в Visual Studio это SqlCommand и SqlCeCommand, в которых в их объекты надо добавлять параметры и вообще настраивать всякие навороты) в средах программирования? Они же всё равно в SQL всё это потом переводят, или нет? Или там как-то на конкретную СУБД и её функции всё завязано, и "чистым" SQL для вставки массивов битовых массивов (т. е. массивов изображений, например) не пользуются? |
|
|
|
|
Richard Ferlow Гуру Предупреждений : 2
|
|
...ммм....в base64 кодировать и вставлять сколько влезет... |
|
|
|
|
AlexRock Гуру |
|
Ага, точно. Нашёл функции декодера base64 в дотНЕТ фреймворке.
А вот интересно, класс SqlCommand внутри себя их же использует, или что-то другое для вставки больших битовых массивов. |
|
|
|
|
Richard Ferlow Гуру Предупреждений : 2
|
|
Не пойму я что-то сей сумбур. выбираешь тип данных, куда твоя картинка в кодированном виде влезет и туда этот код вставляешь. по сути это будет просто большой текст. хотя изображения в SQL хранить не комильфо... |
|
|
|
|
AlexRock Гуру |
|
Richard Ferlow
Да всё в порядке - я теперь разобрался уже. Мне просто интересно, как класс SqlCommand в дотНЕТ фреймворке заталкивает картинки в БД, и как СУБД (MS SQL Server) их отдаёт - в формате ли base64 или что-то своё.
Может, ты знаешь, в каком формате, например, та СУБД, с которой ты работаешь, возвращает картинки и тому подобные данные, если ей текстовым запросом SQL их запросить? Этим же base64? |
|
|
|
|
Richard Ferlow Гуру Предупреждений : 2
|
|
Я работаю с MySQL
так вот, если в нее впихивать картинку предварительно закодировав ее в base64 - то вот таким кодом она там и будет я определенном столбце определенной строки лежать. т.е. типа INSERT ..... (...'$base64image'...)
если картинку надо вывести - то средствами PHP сначала декодируем, потом выводим содержание предварительно не забыв указать в заголовках скрипта что это - изображение. |
|
|
|
|
AlexRock Гуру |
|
А если картинку надо в бинарных данных хранить, то через текстовый интерфейс (чисто кодом SQL) её никак не запихать в БД и не вытащить оттуда? Я не знаю, может, там какие-то внутренние функции СУБД можно прямо в коде SQL вызывать, где указывать источник этих бинарных данных или что-то такое. Поэтому я и использовал класс SqlCommand - в нём в качестве параметров передаются источник данных в виде байтового массива, а байтовый массив раньше из картинки получал. Т. е. всю работу делает класс, а как он это делает - неясно. Вот я и спросил, что, может, он что-то тривиальное делает, типа кодирования в base64 или чего-то подобного. |
|
|
|
|
dipp Эксперт |
|
AlexRock
Ну дык ты посмотри, что там в базе творится после sqlcommand. Увидишь - base64 там, или нет. У столбца какой типа данных вобще? В SQLite есть например BLOB (Binary Large OBject), который может хранить в себе любой бинарный код. Правда, через обычный "INSERT INTO ..." вставить в такой столбец нельзя, нужно использовать спец. функции интерфейса к базе (в случае С++ они так и называются: sqlite_blob_read, write). SqlCommand может быть тоже использует какие-то хитрости при прямом обращении к SQL. Используется MySQL или MS SQL? |
|
|
|
|
AlexRock Гуру |
|
dipp писал(а): |
Ну дык ты посмотри, что там в базе творится после sqlcommand. Увидишь - base64 там, или нет. У столбца какой типа данных вобще? |
Тип данных image, но когда сами данные смотришь, то они binary. Вобщем, понятно, что SqlCommand как-то вставляет их бинарными, но я хотел узнать, как это делать в коде SQL. Вот ты сказал, что
dipp писал(а): |
функции интерфейса к базе (в случае С++ они так и называются: sqlite_blob_read, write) |
- это прямо в коде запроса можно писать, или через какую-то среду программирования, через какой-то фреймворк? Если в коде, то как источники данных указывать, вплоть до самих картинок, которые файлами лежат на диске, скажем?
Я к тому, что можно ли вообще абстрагироваться от всяких фреймворков и запихать (и получить) картинки в БД через только текстовый интерфейс, используя только механизмы самой СУБД и языка SQL, при этом не раскатывая в тексте каждую картинку в коде base64 или ещё каким-то геморным образом? В идеале, вызвать в запросе функцию, в которую передать параметры с именем файла и т. д. С другой стороны, как получить из БД массис картинок в запросе, чтобы потом их куда-то деть? В идеале тоже, например, функцию, в которой указываешь, что куда сохранять.
Есть такое в ваших СУБД, или нет?
dipp писал(а): |
Используется MySQL или MS SQL? |
MS. |
|
|
|
|
medal Форумчанин |
|
Чтобы записать картинку либо бинарник в базу нужно указать заголовок "0x" и далее должно сделовать содержимое файла в hex.
Например
Код: |
insert into TABLENAME(IMG_BIN) values(0x65DEFFE5E7...0FFFFF) |
Справедливо для MSSQL.
Насколько я знаю, у MSSQL нет встроенной функции, которая возьмет содержимое файла из файловой системы. Но можно написать свою, используя, SQLCLR например. http://habrahabr.ru/blogs/sql/88396/
Зачем что-то кодировать в base64? Это не кошерно. |
|
|
|
|
AlexRock Гуру |
|
medal писал(а): |
Зачем что-то кодировать в base64? Это не кошерно. |
Ну, что base64, что битовый массив с этим "0х..." - всё едино и всё неподходит, ибо не руками же мне в код запроса вставлять полмегабайта текста из буфера обмена. А если надо группу картинок за одну транзакцию вставить, а не по одной картинке? Вот и получается, что надо писать свой простенький редактор для вставки картинок, который будет юзать сторонние фреймворки, чтобы в БД вставлять и из неё забирать "трудные" данные. Эта SQLCLR - путь фреймворка.
Т. е., как я понял, стандарт SQL не предусматривает никаких удобных средсвт для вставки битовых массивов, которые (средства) бы всеми СУБД на уровне стандарта SQL бы поддерживались? Каждый производитель СУБД выкручивается по-своему? |
|
|
|
|
medal Форумчанин |
|
AlexRock
Задай вопрос не с конца. Как стоит исходная задача? T-SQL не предназначен для таких вещей. Решать нужно прикладную задачу.
Бинарные данные надо хранить как бинарные данные, а не как закодированные бинарные данные.
Тебе нужно писать простейшую утилиту, которая будет бинарные данные переводить в hex и записывать в базу. Соответственно, извлекая из базы, данные уже будут бинарные и нужно просто записать их в файл, ничего не перекодируя. |
|
|
|
|
medal Форумчанин |
|
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 Гуру |
|
medal
Да задача-то прикладная у меня решена уже - я просто делают свой редактор и вставляю руками (у меня ручное наполнение БД) либо по одной картинке, либо сразу всю директорию с картинками, и использую для этого либо классы SqlCommand, SqlCeCommand, либо LINQ. Я просто столкнулся с тем, что обычные небольшие текстовые данные и числа можно вставлять прямо через текстовый интерфейс SQL, а битовые массивы - только если писать вспомогательные вещи всякие, ибо руками вставлять замучаешься. Опять же, все эти упрощающие функции, которые можно потом вызывать в коде запроса, для каждой СУБД свои, а не общие для всех, которые бы были оговорены в стандарте SQL.
Вобщем, спасибо, я получил ответ на свой вопрос. |
|
|
|
|
|
Аватары: Вкл|Выкл ЮзерИнфо: Вкл|Выкл Подписи: Вкл|Выкл
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы можете скачивать файлы
|
|