![]() |
Модераторы: gambit |
![]() ![]() ![]() |
|
Doss |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 5.10.2007 Репутация: нет Всего: нет |
Доброго всем и здравия!
Знаю, знаю знаю, темы вот они, однако решения в них к сожалению я не нашел. Смотрел все темы на эту тематику: как считать дв.данные и т.д. сохранение картинки. В общем не могу я считать рисунок из базы. 1. БД-Access 2011 2. Поле-im 3. Поле объекта OLE Записываю так: Все ОК
Данные записываются отлично, в базе присутствует надпись "Двоичные данные". А вот мои попытки прочитать этот рисунок и загрузить в pictureBox:
Помогите пожалуйста с этим вопросом, думаю готовое решение уже пора оставить на сайте. Всем спасибо!!!! ![]() Ошибка Parameter is not valid. Это сообщение отредактировал(а) Doss - 12.10.2011, 18:30 |
||||
|
|||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 8 Всего: 118 |
© http://www.eggheadcafe.com/community/aspne...net-coding.aspx -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
Doss |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 5.10.2007 Репутация: нет Всего: нет |
jonie, все верно, однако в чем моя ошибка, не могу я из двоичного вида в Bitmap залить. Кстати, VB.Net можно представить в C#. Смотрел я
ссылку. Не вижу отличия принципиального. Где же тут чудесное преобразование? |
|||
|
||||
Doss |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 5.10.2007 Репутация: нет Всего: нет |
Никто не поделиться ...?
|
|||
|
||||
Doss |
|
||||||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 5.10.2007 Репутация: нет Всего: нет |
Проблема еще не решена.
Насколько я понял и проверил, запись в базу либо не правильна, либо данные, записанные так и должны представляться. Вот здесь:
А проверив тут:
Что то не логично. К примеру если я копирую (ctrl+c) и вставляю в поле базы, оно отображается как "Поле". При всех тех же "фокусах" получаю размер 17801 Опять же одни и тот же рисунок, разные размеры!!! Я не могу понять ПОЧЕМУ? //===== Ну допустим запись правильна. Тогда как мне эти двоичные данные считать из этого поля базы и воткнуть в поток??? ![]() Тогда как далее я этот поток передаю в конструктор MemoryStream() и далее к примеру так
либо так
Примеров много однако, но как я понял, они ориентированы на хранение ссылок в БД, а рисунки на диске. Прошу помочь разобраться в этом вопросе. 1.Опять же одни и тот же рисунок, разные размеры!!! Я не могу понять ПОЧЕМУ? 2.Тогда как мне эти двоичные данные считать из этого поля базы и воткнуть в поток??? Справочно: Имею методы из форума:
|
||||||||||
|
|||||||||||
Doss |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 5.10.2007 Репутация: нет Всего: нет |
Всем большое спасибо за участие, ведь форум предназначен именно для молчаливого вербального понимание неправда ли?
![]() Вопрос РЕШЕН!!!!! ![]() Для завершения данной темы опишу все суть и код: В общем большой двоичный объект (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 - 15.10.2011, 07:44 |
||||
|
|||||
Doss |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 5.10.2007 Репутация: нет Всего: нет |
Лучше BMW - только новое BMW!!!!-)
|
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Базы данных под .NET | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |