Вытащить изображение из поля БД MS Access
От: nasyrov  
Дата: 23.01.07 06:58
Оценка:
Есть БД MS Access, тама таблица, одно поле которой типа "Поле объекта OLE" — там храниться картинка. так вот вопрос, как в .NET (С#) вытащить это изображение?
Re: Вытащить изображение из поля БД MS Access
От: Аноним  
Дата: 23.01.07 08:21
Оценка:
Здравствуйте, nasyrov, Вы писали:

N>Есть БД MS Access, тама таблица, одно поле которой типа "Поле объекта OLE" — там храниться картинка. так вот вопрос, как в .NET (С#) вытащить это изображение?



//Тянешь данные из таблицы, например в DataSet 
.....
DataSet ds;
.....
CurrencyManager cm = (CurrencyManager)this.BindingContext[ds.Tables[0]];
.....
//А здесь смотришь
DataRow dr = ((DataRowView)cm.Current).Row;

byte[] content = (byte[])dr["FIMG"]; //"FIMG"-имя поля с картинкой
MemoryStream stream = new MemoryStream(content);
Bitmap image = new Bitmap(stream);
this.pictureBox1.Image = image;
Re: Вытащить изображение из поля БД MS Access
От: Janii  
Дата: 23.01.07 08:35
Оценка:
Здравствуйте, nasyrov, Вы писали:

N>Есть БД MS Access, тама таблица, одно поле которой типа "Поле объекта OLE" — там храниться картинка. так вот вопрос, как в .NET (С#) вытащить это изображение?


Например, вот так (через OLE DB):


string conString = ...; // строка соединения к базе
string query = "SELECT picture FROM ..."; // текст запроса, возвращающий нужную картинку

byte[] pic = null;
using (OleDbConnection con = new OleDbConnection(conString))
{
    using (OleDbCommand cmd = new OleDbCommand(query, con))
    {
        con.Open();
        using (OleDbDataReader reader = cmd.ExecuteReader())
                { 
            if (reader.Read())
                        {
                int index = reader.GetOrdinal("picture");
                if (!reader.IsDBNull(index))
                {
                    long length = reader.GetBytes(index, 0, null, 0, 0);
                    pic = new byte[length];
                    reader.GetBytes(index, 0L, pic, 0, (int)length);
                }
            }
        }
    }
}


На выходе в массиве pic — картинка. Или null (если запрос ничего не вернет, если в возвращенном поле NULL и т.п).
Re[2]: Вытащить изображение из поля БД MS Access
От: nasyrov  
Дата: 23.01.07 08:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, nasyrov, Вы писали:


N>>Есть БД MS Access, тама таблица, одно поле которой типа "Поле объекта OLE" — там храниться картинка. так вот вопрос, как в .NET (С#) вытащить это изображение?



А>
А>//Тянешь данные из таблицы, например в DataSet 
А>.....
А>DataSet ds;
А>.....
А>CurrencyManager cm = (CurrencyManager)this.BindingContext[ds.Tables[0]];
А>.....
А>//А здесь смотришь
А>DataRow dr = ((DataRowView)cm.Current).Row;

А>byte[] content = (byte[])dr["FIMG"]; //"FIMG"-имя поля с картинкой
А>MemoryStream stream = new MemoryStream(content);
А>Bitmap image = new Bitmap(stream);
А>this.pictureBox1.Image = image;
А>


неа, не проходит.. тоже сначала так пробовал... на строке
Bitmap image = new Bitmap(stream);
вылетает ArgumentException ("Недопустимый параметр")

и еще странно, исходный файл (изобр) имеет размер 3128 байт, а в поле записано 4869 байт..
кстати, я БД заполняю в самом MS Accesse и втавляю в это поле объект из файла (bmp), может быть из-за этого?? или там инрогда проскакивает какой-то упаковщик, м.б. пакует?
Re[2]: Вытащить изображение из поля БД MS Access
От: Lloyd Россия  
Дата: 23.01.07 09:12
Оценка:
Здравствуйте, Janii, Вы писали:

J>На выходе в массиве pic — картинка. Или null (если запрос ничего не вернет, если в возвращенном поле NULL и т.п).


И что вы дальше собрались с этим делать. Написано-же "OLE-объект".
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Вытащить изображение из поля БД MS Access
От: Аноним  
Дата: 23.01.07 09:50
Оценка:
Здравствуйте, nasyrov, Вы писали:

N>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, nasyrov, Вы писали:


N>>>Есть БД MS Access, тама таблица, одно поле которой типа "Поле объекта OLE" — там храниться картинка. так вот вопрос, как в .NET (С#) вытащить это изображение?



N>>> или там инрогда проскакивает какой-то упаковщик, м.б. пакует?


Не совсем уверен, но можно попробовать распаковать:

Упакова-распаковка OLE &mdash; самая первая ссылка
Re[3]: Вытащить изображение из поля БД MS Access
От: Janii  
Дата: 23.01.07 09:50
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>И что вы дальше собрались с этим делать. Написано-же "OLE-объект".


Да, сорри, ступил немного. Если вопрос именно "как вытащить картинку из OLE-обьекта", то мой пост на этот вопрос не отвечает. Ставлю себе минус за невнимательность
RE: Вытащить изображение из поля БД MS Access
От: Аноним  
Дата: 23.01.07 12:45
Оценка:
Если там действительно имаж — нужно выкусить первые 78 байт (заголовок OLE)
Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[4]: Вытащить изображение из поля БД MS Access
От: war_exe  
Дата: 18.03.08 12:20
Оценка:
Здравствуйте, Janii, Вы писали:

J>Здравствуйте, Lloyd, Вы писали:


L>>И что вы дальше собрались с этим делать. Написано-же "OLE-объект".


J>Да, сорри, ступил немного. Если вопрос именно "как вытащить картинку из OLE-обьекта", то мой пост на этот вопрос не отвечает. Ставлю себе минус за невнимательность



вы правы!имея массив байт вы можете залить картинку через FileStreamWriter


try
{
int PictureCol = 0; // Position of picture column in DataReader.
int BUFFER_LENGTH = 32768;// Chunk size.
OleDbConnection cn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=db1.mdb;User ID=Admin;Password=;");

// Make sure Photo is non-NULL and return TEXTPTR to it.

OleDbCommand cmdGetPointer = new OleDbCommand("SELECT ?=TEXTPTR(Picture), ?=DataLength(Picture) FROM t_Answers WHERE Id=1099007", cn);
OleDbParameter PointerOutParam = cmdGetPointer.Parameters.Add("@Pointer", OleDbType.VarBinary, 100);
PointerOutParam.Direction = System.Data.ParameterDirection.Output;
OleDbParameter LengthOutParam = cmdGetPointer.Parameters.Add("@Length", OleDbType.Integer);
LengthOutParam.Direction = System.Data.ParameterDirection.Output;
cn.Open();
try
{
cmdGetPointer.ExecuteNonQuery();
}
catch (Exception e)
{
Console.Write(e.Message);
}
//if (PointerOutParam.Value == null)
//{
// cn.Close();
// // Add code to deal with NULL BLOB.
// return;
//}

// Set up READTEXT command, parameters, and open BinaryReader.

OleDbCommand cmdReadBinary = new OleDbCommand("READTEXT t_Answers.HtmlContCmpr ? ? ? HOLDLOCK", cn);
OleDbParameter PointerParam = cmdReadBinary.Parameters.Add("@Pointer", OleDbType.Binary, 16);
OleDbParameter OffsetParam = cmdReadBinary.Parameters.Add("@Offset", OleDbType.Integer);
OleDbParameter SizeParam = cmdReadBinary.Parameters.Add("@Size", OleDbType.Integer);
OleDbDataReader dr;

System.IO.FileStream fs = new System.IO.FileStream(Console.ReadLine(), System.IO.FileMode.Create, System.IO.FileAccess.Write);
int Offset = 0;
OffsetParam.Value = Offset;
Byte[] Buffer = new Byte[BUFFER_LENGTH];

//Read buffer full of data and write to the file stream.

do
{
PointerParam.Value = PointerOutParam.Value;

// Calculate buffer size — may be less than BUFFER_LENGTH for last block.

if ((Offset + BUFFER_LENGTH) >= System.Convert.ToInt32(LengthOutParam.Value))
SizeParam.Value = System.Convert.ToInt32(LengthOutParam.Value) — Offset;
else SizeParam.Value = BUFFER_LENGTH;

dr = cmdReadBinary.ExecuteReader(System.Data.CommandBehavior.SingleResult);
dr.Read();
dr.GetBytes(PictureCol, 0, Buffer, 0, System.Convert.ToInt32(SizeParam.Value));
dr.Close();
fs.Write(Buffer, 0, System.Convert.ToInt32(SizeParam.Value));
Offset += System.Convert.ToInt32(SizeParam.Value);
OffsetParam.Value = Offset;
} while (Offset < System.Convert.ToInt32(LengthOutParam.Value));

fs.Close();
cn.Close();
}
catch (OleDbException ex)
{
Console.Write(ex.Message);
Console.ReadLine();
}



нужна фдфптация под Access
Re[3]: Вытащить изображение из поля БД MS Access
От: war_exe  
Дата: 18.03.08 12:25
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Janii, Вы писали:


J>>На выходе в массиве pic — картинка. Или null (если запрос ничего не вернет, если в возвращенном поле NULL и т.п).


L>И что вы дальше собрались с этим делать. Написано-же "OLE-объект".



FileStream fs1 = new FileStream("Pict.bmp", FileMode.Create);

BinaryWriter w = new BinaryWriter(fs1);


for (int i = 0; i < pic.Length; i++)
{
w.Write(pic[i]);
}
w.Close();
fs1.Close();
Re[4]: Вытащить изображение из поля БД MS Access
От: Lloyd Россия  
Дата: 18.03.08 13:35
Оценка:
Здравствуйте, war_exe, Вы писали:

_> FileStream fs1 = new FileStream("Pict.bmp", FileMode.Create);


_> BinaryWriter w = new BinaryWriter(fs1);



_> for (int i = 0; i < pic.Length; i++)

_> {
_> w.Write(pic[i]);
_> }
_> w.Close();
_> fs1.Close();


Оно работает?
... << RSDN@Home 1.2.0 alpha rev. 786>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.