Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > вывод изображения в PictureBox из БД


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

Автор: Red Wind 20.8.2006, 17:04
Какраз таки, через 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)


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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)