Я работаю над перестройкой основанной на доступе системы в c#.net, однако когда MS пошел от офиса 2003 до офиса 2007, они удалили фоторедактора в доступе - который означал, что ранее сохраненные изображения больше не будут отображаться в системе. Парни в компании сделали взлом, который в основном сохранил образы с VBA, использующим Excel в фоновом режиме (я могу получить больше информации, если Вам нужен он), но в основном это означало, что средства управления изображением доступа могли бы все еще использоваться (Объект связал кадры).
Однако у меня теперь есть проблема попытки отобразить их в приложениях.NET, и после бесчисленных дней попытки различных способов управлять массивом байтов, который я близко к отказу. Я попробовал по крайней мере 8 различных предложенных решений, и каждый заканчивает 'Параметром не распознанное' исключение при выполнении Image.fromStream (). Ниже код, который имеет меня самое близкое до сих пор:
private void imageExtractTest()
{
LogOnDataSetTableAdapters.QueriesTableAdapter qa =
new LogOnDataSetTableAdapters.QueriesTableAdapter();
object docO = qa.GetLogonImage();
if (docO == null || !(docO is byte[]))
{
return;
}
byte[] doc = (byte[])docO;
MemoryStream ms = new MemoryStream();
ms.Write(doc, 0, doc.Length);
int firstByte;
int secondByte;
ms.Seek(0, SeekOrigin.Begin);
firstByte = ms.ReadByte();
secondByte = ms.ReadByte();
if (firstByte != 0x15 && secondByte != 0x1C)
{
//ErrorResponse("Stored object is not an Access File.");
return;
}
int fileTypeLoc = 20; // begin of the file type
short offset; // end of the file type
byte[] buffer = new byte[2];
ms.Read(buffer, 0, 2);
offset = BitConverter.ToInt16(buffer, 0);
long seekTotal = 0;
seekTotal += offset;
string docType = String.Empty;
for (int i = fileTypeLoc; i < offset; i++)
{
docType += (char)doc[i];
}
//if I query docType now I get 'Picture\0\0'
// magic eight bytes 01 05 00 00 03 00 00 00
ms.Seek(seekTotal, SeekOrigin.Begin);
buffer = new byte[8];
ms.Read(buffer, 0, 8);
seekTotal += 8;
// Second offset to move to
buffer = new byte[4];
ms.Read(buffer, 0, 4);
seekTotal += 4;
long offset2 = BitConverter.ToInt32(buffer, 0);
seekTotal += offset2;
ms.Seek(seekTotal, SeekOrigin.Begin);
// eight empty bytes
buffer = new byte[8];
ms.Read(buffer, 0, 8);
seekTotal += 8;
// next n bytes are the length of the file
buffer = new byte[4];
ms.Read(buffer, 0, 4);
seekTotal += 4;
long fileByteLength = BitConverter.ToInt32(buffer, 0);
// next N bytes are the file
byte[] data = new byte[fileByteLength];
// store file bytes in data buffer
ms.Read(data, 0, Convert.ToInt32(fileByteLength));
MemoryStream imageStream = new MemoryStream(data);
Image test = Image.FromStream(imageStream);
}
Этот код был адаптирован отсюда, мне не была нужна различная doctypes идентификация, поскольку я только имею дело с изображениями, однако тип изображения мог быть любым количеством вещей - jpg, bmp, gif, png и т.д.
Я также попытался сохранить произведенный массив байтов, но у меня не было удачи при просмотре этого также. Но когда я указываю на доступ к базе данных и заставляю это просматривать его, все прекрасно. Также Конструктор отчетов Кристалла.NET может получить эти изображения некоторые, как - таким образом, они должны быть там где-нибудь...
Кто-либо получил какие-либо идеи?
Marlon
Попытка получить поле изображения OLE для MS-доступа из .NET - гораздо больше головной боли, чем она того стоит. В этом посте есть хорошее обсуждение и информация по этой теме.
В конечном счете, лучшее и самое простое решение для достижения успеха - использовать рабочий метод просмотра для сохранения этих изображений в виде отдельных файлов, а затем импортировать эти файлы в базу данных как поля BLOB, а не как поля изображений. Затем вы можете легко прочитать их в .NET.
Попробуйте эту статью KB http://support.microsoft.com/kb/317701 от microsoft. В ней содержится информация о том, как получить доступ к блобу изображения из access и отобразить его в приложении winforms.