Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> экспорт картинки, экспорт из поля объекта OLE 
:(
    Опции темы
vasjon
Дата 14.10.2007, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 26.9.2007

Репутация: нет
Всего: нет



Пытаюсь экспортировать данные из Access таблицы. В таблице есть текстовые поля (сними проблем нет) и есть поле объекта OLE, в котором хранится jpg картинка. Сейчас для экспорта текста использую следующий код:
Код

using (OleDbConnection Conn = new OleDbConnection(ConfigurationSettings.AppSettings["base1"]))
      {
        Conn.Open();
        OleDbCommand SelCommand = new OleDbCommand("SELECT id, price FROM prod;", Conn);        
       
        SelCommand.CommandType = CommandType.Text;
        SelCommand.Connection = Conn;
        OleDbDataReader dr = SelCommand.ExecuteReader();

        using (StreamWriter sw = new StreamWriter("sql.txt"))
        {
          do
          {
            while (dr.Read())
            {
              sw.WriteLine("UPDATE prod SET price=" + dr[1].ToString() + " WHERE id= "+ dr[0] + "; ");              
            }
            
          } while (dr.NextResult());          
        }        
        dr.Close();
        Conn.Close();       
      }

соотвественно если пытаюсь выгрузить данные из поля foto, то получаю запись: System.Byte[] в текстовом файле. Возможно ли получить фотку данным способом ? И как ее импортировать потом ?
PM MAIL   Вверх
tol05
Дата 14.10.2007, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



не очень понятно что тебе нужно. Записать результаты в текстовый файл? Или получить картинку в программу?
Для картинки можно создать объект Image из массива байт. 
Код

byte[] buffer = (byte[])dr[...];
MemoryStream stream = new MemoryStream(buffer);
Image image = Image.FromStream(stream);



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
vasjon
Дата 14.10.2007, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 26.9.2007

Репутация: нет
Всего: нет



в конечном итоге мне нужно получить файл с sql дампом (если это возможно):
UPDATE prod SET price=887, foto='код фото' WHERE id=1; 
при выполнении которого я получу картинки в БД
PM MAIL   Вверх
RWander
Дата 1.12.2007, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 4.5.2006
Где: Russia.Udm.Izhevs k

Репутация: нет
Всего: 6



что значит [..] в строке byte[] buffer = (byte[])dr[...];??

Добавлено @ 16:41
Код

// Устанавливаем соединение с БД
SqlCeConnection connection=new SqlCeConnection("Data Source = Test.sdf");
connection.Open();
// формируем запрос на выборку даных
SqlCeCommand cmd=new SqlCeCommand("select * from Users where id=2", connection);
// для чтения изображения используем DataReader
SqlCeDataReader datareader = cmd.ExecuteReader();
datareader.Read();
// позиция поля в списке полученных полей 
// замечание: если делать так: select foto from Users where id=2, то позиция будет =0
int FieldPosInQuery = 2;
// первым запросом, используя null вместо буфера — получаем размер хранимых данных
// второй и четвертый параметры (=0 в нашем случае) отвечают за смещение начала получаемых данных и смещение начала записываемых данных в буфер, соответственно. 
//Обычно используются при сложных данных, которые необходимо "собирать вручную"
int length = (int)datareader.GetBytes(FieldPosInQuery, 0, null, 0, int.MaxValue);
// выделяем буфер…
byte[] buf = new byte[length];
// …и читаем непосредственно данные
datareader.GetBytes(FieldPosInQuery, 0, buf, 0, length);
// создаем поток в памяти из данных буфера…
MemoryStream ms = new MemoryStream(buf);
// …и создаем на его основе изображение
Bitmap bmp = new Bitmap(ms);
// отображаем, либо используя файловый поток сохраняем на диск
pictureBox1.Image = bmp;


Это сообщение отредактировал(а) RWander - 1.12.2007, 16:41


--------------------
Microsoft Certified Technology Specialist - ASP.NET Applications
PM MAIL   Вверх
headzero
Дата 1.12.2007, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 14.11.2006

Репутация: нет
Всего: 1



У меня такой код вызывает исключение и ошибку System.ArgumentException...   Parameter is not valid
Код

 int length = (int)myReader.GetBytes(myReader.GetOrdinal("Pic"), 0, null, 0, int.MaxValue);
                byte[] buf = new byte[length];
                myReader.GetBytes(myReader.GetOrdinal("Pic"), 0, buf, 0, int.MaxValue);
                Stream ms = new MemoryStream(buf);
                MessageBox.Show(buf.LongLength.ToString());
                pictureBox3.Image = new Bitmap(ms);  //На этой строке ошибка

Помогите разобраться, в чем причина. Я уже перерыл весь форум и частично MSDN. Везде разные способы, и постоянно одна и та же ошибка(указанная выше)

Это сообщение отредактировал(а) headzero - 1.12.2007, 23:04


--------------------
Воображение важнее знания
                                                     (Алберт Эйнштейн)
PM MAIL   Вверх
RWander
Дата 2.12.2007, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 4.5.2006
Где: Russia.Udm.Izhevs k

Репутация: нет
Всего: 6



попробуй вместо 
Код

 Stream ms = new MemoryStream(buf);
 написать 
Код

MemoryStream ms = new MemoryStream(buf);



или сделать явное преобразование типа: 
Код

 pictureBox3.Image = new Bitmap((MemoryStream)ms); 


может поможет smile


--------------------
Microsoft Certified Technology Specialist - ASP.NET Applications
PM MAIL   Вверх
1stain
Дата 2.12.2007, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 5
Всего: 40



посмотри здесь
gotdotnet FAQ

если влом читать, попробуй так: 
Код

myReader.GetBytes(myReader.GetOrdinal("Pic"), 78, buf, 0, int.MaxValue);




Это сообщение отредактировал(а) 1stain - 2.12.2007, 20:22


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
tol05
Дата 2.12.2007, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



Есть такое предположение... В msdn по поводу GetBytes() написано:
Цитата

GetBytes returns the number of available bytes in the field. Most of the time this is the exact length of the field. However, the number returned may be less than the true length of the field if GetBytes has already been used to obtain bytes from the field. This may be the case, for example, when the OleDbDataReader is reading a large data structure into a buffer. For more information, see the SequentialAccess setting for CommandBehavior.

предлагаю попробовать так:
Код

OleDbDataReader dr = SelCommand.ExecuteReader(CommandBehavior.SequentialAccess);



RWander, явные преобразования типа никчему, т.к. Bitmap требует параметр типа Stream и CLR будет пытаться приводить параметр именно к этому типу, т.е.
Код

pictureBox3.Image = new Bitmap((MemoryStream)ms); 

равносильно коду
Код

Stream s = new MemoryStream(buf);
MemoryStream ms = (MemoryStream)s;
Stream s_runtime = (Stream)ms;
pictureBox3.Image = new Bitmap(s_runtime); 



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0471 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.