| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Базы данных под .NET > Чтение из БД двоичные данные |
| Автор: Doss 12.10.2011, 18:25 | ||||
| Доброго всем и здравия! Знаю, знаю знаю, темы вот они, однако решения в них к сожалению я не нашел. Смотрел все темы на эту тематику: http://http://forum.vingrad.ru/topic-184581.html и т.д. http://http://forum.vingrad.ru/forum/topic-255388.html. В общем не могу я считать рисунок из базы. 1. БД-Access 2011 2. Поле-im 3. Поле объекта OLE Записываю так: Все ОК
Данные записываются отлично, в базе присутствует надпись "Двоичные данные". А вот мои попытки прочитать этот рисунок и загрузить в pictureBox:
Помогите пожалуйста с этим вопросом, думаю готовое решение уже пора оставить на сайте. Всем спасибо!!!! Ошибка Parameter is not valid. |
| Автор: jonie 12.10.2011, 19:18 | ||
© http://www.eggheadcafe.com/community/aspnet/2/10079586/how-to-store-image-in-msaccess-using-cnet-coding.aspx |
| Автор: Doss 12.10.2011, 19:55 |
| jonie, все верно, однако в чем моя ошибка, не могу я из двоичного вида в Bitmap залить. Кстати, VB.Net можно представить в C#. Смотрел я ссылку. Не вижу отличия принципиального. Где же тут чудесное преобразование? |
| Автор: Doss 13.10.2011, 10:22 |
| Никто не поделиться ...? |
| Автор: Doss 14.10.2011, 10:52 | ||||||||||
| Проблема еще не решена. Насколько я понял и проверил, запись в базу либо не правильна, либо данные, записанные так и должны представляться. Вот здесь:
А проверив тут:
Что то не логично. К примеру если я копирую (ctrl+c) и вставляю в поле базы, оно отображается как "Поле". При всех тех же "фокусах" получаю размер 17801 Опять же одни и тот же рисунок, разные размеры!!! Я не могу понять ПОЧЕМУ? //===== Ну допустим запись правильна. Тогда как мне эти двоичные данные считать из этого поля базы и воткнуть в поток??? Тогда как далее я этот поток передаю в конструктор MemoryStream() и далее к примеру так
либо так
Примеров много однако, но как я понял, они ориентированы на хранение ссылок в БД, а рисунки на диске. Прошу помочь разобраться в этом вопросе. 1.Опять же одни и тот же рисунок, разные размеры!!! Я не могу понять ПОЧЕМУ? 2.Тогда как мне эти двоичные данные считать из этого поля базы и воткнуть в поток??? Справочно: Имею методы из форума:
|
| Автор: Doss 15.10.2011, 07:33 | ||||
| Всем большое спасибо за участие, ведь форум предназначен именно для молчаливого вербального понимание неправда ли? Вопрос РЕШЕН!!!!! Для завершения данной темы опишу все суть и код: В общем большой двоичный объект (BLOB) можно записывать в базу данных в виде двоичных или символьных данных в зависимости от типа поля источника данных. BLOB — это общий термин для типов данных text, ntext и image, используемых, как правило, для хранения документов и изображений. Чтобы записать значение BLOB в базу данных, выполняется соответствующая инструкция INSERT или UPDATE, передав значение BLOB в качестве входного параметра. Если объект BLOB хранится как текст, например поле SQL Server text, можно передать значение BLOB в виде строкового параметра. Если объект BLOB хранится в двоичном формате, например поле SQL Server image, в качестве двоичного параметра можно передать массив с типом данных byte. Что мы и делаем ниже:
Ну понятно, что в базе два поля кроме счетчика это im (BLOB) и Pid (Text) Поехали далее, вот теперь записанные данные в базе необходимо прочитать, а желательно фото или рисунок отобразить в чем-либо, ну к примеру в pictureBox. По умолчанию объект DataReader загружает входящие данные в виде строки, как только вся строка данных будет в наличии. Однако для больших двоичных объектов (BLOB) требуется другая процедура, поскольку они могут содержать гигабайты данных, которые невозможно уместить в одной строке. Метод Command.ExecuteReader имеет перегрузку, которая принимает аргумент CommandBehavior, чтобы изменять характер действий объекта DataReader по умолчанию. Аргумент SequentialAccess можно передать методу ExecuteReader, чтобы изменить характер действий объекта DataReader по умолчанию, чтобы он загружал не строки данных, а последовательно сами данные по мере их поступления. Это идеально подходит для загрузки больших двоичных объектов или других больших структур данных. Отметим, что этот характер действий может зависеть от источника данных. Например, при возвращении большого двоичного объекта из Microsoft Access он загружается в память целиком, а не последовательно по мере поступления. При указании объекту DataReader использовать метод SequentialAccess важно отметить последовательность, в которой должны открываться возвращенные поля. При характере действий объекта DataReader по умолчанию, когда загружается вся строка целиком, как только она есть в наличии, пока не будет считана следующая строка, доступ к возвращенным полям можно получить в любом порядке. Однако при использовании метода SequentialAccess открывать поля, возвращенные объектом DataReader, необходимо по порядку. Например, если запрос возвращает три столбца и третий из них — это большой двоичный объект, необходимо возвратить значение первого и второго поля перед тем, как открыть данные большого двоичного объекта в третьем поле. Если открыть третье поле сначала, то значения первого и второго полей будут недоступны. Происходит это потому, что метод SequentialAccess внес изменение в объект DataReader, согласно которому данные должны возвращаться последовательно. Поэтому, если объект DataReader считал последующие данные раньше предыдущих, предыдущие данные будут недоступны. При доступе к данным в поле большого двоичного объекта используйте типизированные методы доступа GetBytes или GetChars объекта DataReader, которые заполняют массив данными. Также можно использовать метод GetString для символьных данных, однако для сохранения ресурсов системы лучше не загружать все значение большого двоичного объекта в одну строковую переменную. Вместо этого можно указать определенный размер буфера данных, которые должны быть возвращены, а также начальное положение для первого байта или символа, читаемого из возвращенных данных. Методы GetBytes и GetChars возвращают значение long, которое представляет число возвращенных байт или символов. Если методу GetBytes или GetChars передать пустой массив, то возвращенное длинное значение будет общим числом байт или символов в большом двоичном объекте. При необходимости можно в массиве указать индекс в качестве начальной позиции для читаемых данных. Вот и начали:
Надеюсь помогу следующим форумчанам, у кого возникнут такие же вопросы. Кстати, рисунок следующий ![]() |
| Автор: Doss 17.11.2011, 19:41 |
| Лучше BMW - только новое BMW!!!!-) |