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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вывод изображения в PictureBox из БД, вывод изображения в PictureBox из БД 
:(
    Опции темы
davandr
Дата 19.8.2006, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Подскажите, как можно вывести изображения в PictureBox из БД.  БД Access, поле таблицы, в котором хранится картинка типа OLE.  Понимаю, что через DataBindings, но ни фига не получается. Причем это надо сделать программно, а не через панель Properties.

Это сообщение отредактировал(а) davandr - 19.8.2006, 15:28


--------------------
PM MAIL   Вверх
Red Wind
Дата 20.8.2006, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Какраз таки, через DataBindings сделать это будет сложновато.

Когда-то я написал код хранящий массив в БД. Принцип тот-же, только этот код работает с SQL Server, а для Access нужно вместо SqlConnection, SqlCommand и т.п. использовать OleDbConnection, OleDbCommand. Собственно чтение из ДБ, осуществляеться методом ReadByteMas. Метод возвращает массив байтов, и уже этот массив нужно преобразовывать в картинку.

Код

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Data;
using System.Data.SqlClient;
using System.Runtime.Serialization.Formatters.Binary;

namespace Veles.Web
{

    public static class ArrayInDBClass
    {

        public static byte[] StringMasToByteMas(string[] StringMas)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            MemoryStream stream = new MemoryStream();
            formatter.Serialize(stream, StringMas);
            byte[] ByteMas = stream.ToArray();

            stream.Close();

            return ByteMas;
        }

        public static void WriteByteMasToDB(string TableName, string ColName, string WhereStr, string WhereDef, byte[] ByteMas)
        {
            SqlConnection connection = new SqlConnection("server=localhost;database=Board;uid=temp;pwd=temptemp");
            SqlCommand command = new SqlCommand("UPDATE " + TableName +
                " SET " + ColName + " = @NewInfo WHERE " + WhereStr + " = \'" +
                WhereDef + "\'", connection);

            command.Parameters.Add("@NewInfo", SqlDbType.Image, ByteMas.Length).Value = ByteMas;

            connection.Open();
            command.ExecuteNonQuery();
        }

        public static string[] ByteMasToStringMas(byte[] ByteMas)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            MemoryStream stream = new MemoryStream();

            stream.Write(ByteMas, 0, ByteMas.Length);
            stream.Seek(0, SeekOrigin.Begin);

            string[] StringMas = new string[1];

            try
            {
                StringMas = (string[])formatter.Deserialize(stream);
            }
            catch
            {

            }
            stream.Close();

            return StringMas;
        }

        public static byte[] ReadByteMas(string TableName, string ColName, string WhereStr, string WhereDef)
        {
            SqlConnection connection = new SqlConnection("server=localhost;database=Board;uid=temp;pwd=temptemp");
            SqlCommand command = new SqlCommand("SELECT " + ColName + " FROM " + TableName + " WHERE " + WhereStr + " = \'" +
                  WhereDef + "\'", connection);

            connection.Open();
            SqlDataReader reader = command.ExecuteReader(); //CommandBehavior.SequentialAccess

            byte[] ByteMas = new byte[1];
            while (reader.Read())
            {

                try
                {
                    byte[] ForReturn = reader.GetSqlBinary(0).Value;
                    ByteMas = ForReturn;
                }
                catch
                {

                }
            }

            reader.Close();
            connection.Close();
            return ByteMas;
        }
    }

}


А вот примерчик из MSDN (на VB.NET):

Код

Dim cn As New System.Data.OleDb.OleDbConnection("Your Connection String")
Dim cmd As New System.Data.OleDb.OleDbCommand("Your Select Command", cn)
Dim dr As System.Data.OleDb.OleDbDataReader
Dim pictureColumn As Integer = 0
Dim b(Integer.MaxValue - 1) As Byte

cn.Open()
dr = cmd.ExecuteReader()
dr.Read()
dr.GetBytes(pictureColumn, 0, b, 0, b.Length)
dr.Close()
cn.Close()

MessageBox.Show("Bytes read from database: " & b.Length.ToString())

Dim bs As System.IO.Stream = New System.IO.MemoryStream()
bs.Write(b, 0, b.Length)

PictureBox1.Image = Image.FromStream(bs)


PM MAIL ICQ   Вверх
davandr
Дата 22.8.2006, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А каким должен быть тип поля в Access, в котором будет хранится картинка OLE или Memo? 


--------------------
PM MAIL   Вверх
mr.DUDA
Дата 22.8.2006, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Тип данных должен быть OLE, т.к. никакой другой тип данных не позволяет хранить бинарные данные. Тип данных в .NET для такого поля будет byte[]. То есть, можно класть произвольные данные - взять например Image, сохранить в MemoryStream и положить байтовый массив из стрима в поле OLE.


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

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




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


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

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