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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как считать двоичные данные из Access 
:(
    Опции темы
headzero
Дата 29.11.2007, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как заносить рисунки в Access я уже разобрался. А вот как считать двоичные данные?Не получается
Следующий код не работает
Код

            DBConnector db = new DBConnector();// Мой класс
            OleDbCommand command = new OleDbCommand("SELECT Picture FROM TOV;", db.ConnectToDatabase());
            OleDbDataReader reader = command.ExecuteReader();
            byte[] bytes;
            while(reader.Read())
            bytes = reader["Picture"];   //Ошибка на этой строке


Как все таки считать двоичные данне из БД и поместить их в массив битов для последующего перевода в Bitmap и отображения в Пикчербоксе?Cпасибо

Это сообщение отредактировал(а) headzero - 30.11.2007, 10:53


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 937
Регистрация: 3.12.2004
Где: Санкт-Петербург/П рага

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



Для чтения BLOB полей БД используй GetBytes метод у DataReader`а.
PM ICQ MSN   Вверх
headzero
Дата 1.12.2007, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ничего не получается. Вот мой код
Код

OleDbCommand command = new OleDbCommand("SELECT * FROM TOV WHERE DetName='Detal';", db.ConnectToDatabase());
            OleDbDataReader reader = command.ExecuteReader();
        
            int w = reader.GetOrdinal("Picture");
            MessageBox.Show(w.ToString());
            int streamSize = (int)reader.GetBytes(0,0, null, 0, 0);// На этой строке ошибка No data exists in currentcolumn/row,хотя двоичные данные там точно есть

            long t = reader.GetBytes(0, w, bytr, 0, streamSize);


Помогайте пожалуста


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 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. Везде разные способы, и постоянно одна и та же ошибка(указанная выше)


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


Опытный
**


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

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



headzero  а подскажи студенту плиззз,как заносить рисунки в Access и как считывать.Зарание огромное спасибо.
PM MAIL   Вверх
unicuum
Дата 5.12.2007, 05:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот из недоделанного мною кода, здесь не обрабатываются исключения (ну не сделал я обработку) и написано немного коряво, зато всё работает как часы smile 

Код

    Private Sub LoadPictures()
        ' считываем данные
        Dim cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\MyBase.mdb")
        cn.Open()
        Dim cmd As OleDbCommand = cn.CreateCommand()
        cmd.CommandText = "Select idCenters, fldName, fldImage From tblCenters;"
        Dim rdr As OleDbDataReader = cmd.ExecuteReader
        While rdr.Read()
            ListView1.Items.Add(rdr.GetInt32(0).ToString(), rdr.GetInt32(0).ToString(), rdr.GetInt32(0).ToString())
            Try
                Dim aBinaryBlob As Byte()
                aBinaryBlob = CType(rdr(2), Byte())
                Dim bmp As Bitmap = CType(Bitmap.FromStream(New System.IO.MemoryStream(aBinaryBlob)), Bitmap)
                ImageList1.Images.Add(rdr.GetInt32(0).ToString(), bmp)
            Catch ex As ApplicationException
                MsgBox(ex.Message)
            End Try
        End While
        rdr.Close()
        cn.Close()
    End Sub

Собственно говоря за считывание отвечает лишь вот этот код.

Код

                Dim aBinaryBlob As Byte()
                aBinaryBlob = CType(rdr(2), Byte())
                Dim bmp As Bitmap = CType(Bitmap.FromStream(New System.IO.MemoryStream(aBinaryBlob)), Bitmap)

1 строка: создаём массив байтов - BLOB Binary Large OBject - большой бинарный объект.
2 строка: из третьего поля, они считаются с нуля, берём блоб.
3 строка: преобразователь из блоба

Или вот считать картинки из базы:

Код

    Private Sub UpdatePictures()
        ' Открываем базу данных
        Dim cn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\MyBase.mdb")
        cn.Open()

        ' Создаём запрос на обновление
        Dim cmd As OleDbCommand = cn.CreateCommand()
        cmd.CommandText = "UPDATE tblCenters SET fldImage = ? WHERE idCenters = ?;"
        cmd.Parameters.Add("@Image", OleDbType.LongVarBinary, Integer.MaxValue - 1)
        cmd.Parameters.Add("@CentersID", OleDbType.Integer)

        ' Инициализируем объекты
        Dim strPathToFile As String = "C:\pictures.png"
        Dim bmp As New Bitmap(strPathToFile)
        Dim intCentersID As Integer

        For intCentersID = 1 To 13
            cmd.Parameters("@CentersID").Value = intCentersID
            Dim ms As New System.IO.MemoryStream

            bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png)

            ' Записываем изображение в базу данных
            cmd.Parameters("@Image").Value = ms.ToArray()
            cmd.ExecuteNonQuery()
        Next

        ' Закрываем базу данных
        cn.Close()
    End Sub

Вообще примеры выдраны из моей недоделанной и неоптимизированной программы, но общую суть уловить можно. smile Главное параметры не перепутать, они должны идти точно так как в запросе.

Кстати, это же отсоединёная работа с базой, а ведь есть ещё присоединённая, виртуальные режимы и всё такое. Короче, те кто почерпнул для себя полезное ставьте мне плюсик  smile (шутка!!!)


--------------------
user posted image
обычный день на винграде
PM   Вверх
shark1
Дата 6.12.2007, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Подскажите а как этот код переделать на C#.Спасибо
PM MAIL   Вверх
unicuum
Дата 6.12.2007, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Сравнение языков для MSDN 2003
ms-help://MS.VSCC.2003/MS.MSDNQTR.2004JUL.1033/vsintro7/html/vxgrfLanguageEquivalents.htm

Сравнение языков для MSDN 2005
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.en/dv_vsref/html/cbcb8496-ecdf-464b-b1c3-ff5f016b992f.htm

Смотрим по таблице и переделываем.


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

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

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

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


 




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


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

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