Есть БД MS Access, тама таблица, одно поле которой типа "Поле объекта OLE" — там храниться картинка. так вот вопрос, как в .NET (С#) вытащить это изображение?
Здравствуйте, 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;
Здравствуйте, 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 и т.п).
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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), может быть из-за этого?? или там инрогда проскакивает какой-то упаковщик, м.б. пакует?
Здравствуйте, Janii, Вы писали:
J>На выходе в массиве pic — картинка. Или null (если запрос ничего не вернет, если в возвращенном поле NULL и т.п).
И что вы дальше собрались с этим делать. Написано-же "OLE-объект".

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, nasyrov, Вы писали:
N>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, nasyrov, Вы писали:
N>>>Есть БД MS Access, тама таблица, одно поле которой типа "Поле объекта OLE" — там храниться картинка. так вот вопрос, как в .NET (С#) вытащить это изображение?
N>>> или там инрогда проскакивает какой-то упаковщик, м.б. пакует?
Не совсем уверен, но можно попробовать распаковать:
Упакова-распаковка OLE — самая первая ссылка
Здравствуйте, Lloyd, Вы писали:
L>И что вы дальше собрались с этим делать. Написано-же "OLE-объект".
Да, сорри, ступил немного. Если вопрос именно "как вытащить картинку из OLE-обьекта", то мой пост на этот вопрос не отвечает. Ставлю себе минус за невнимательность
Если там действительно имаж — нужно выкусить первые 78 байт (заголовок OLE)
Многие вещи нам непонятны не оттого, что наши понятия слабы, а оттого, что данные вещи не входят в круг наших понятий.
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Здравствуйте, 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
Здравствуйте, 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();
Здравствуйте, 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>>