Форум: "Базы";
Текущий архив: 2009.06.14;
Скачать: [xml.tar.bz2];
ВнизMS Access-овские OLE-объекты. Как с ними работать без Access-а? Найти похожие ветки
← →
ЮЮ © (2008-09-22 09:01) [0]Ситуация такая: средствами Access-а был выполнен эксполт в таблицы на MS SQL. Поле стало типа image и Access все так же отображает из на формах из прилинкованных таблиц.
Однако возникли проблемы:
Изменение (загрузка другой картинки) не сохраняется на сервере, хотя никаких ошибок Access не выдает. Идеально было бы воообще отказаться от Access-а, но возникает вопрос: чем докопаться до бинарных данных? TOleContainer.LoadFromStream считает поток данных неверным.
← →
damp (2008-09-22 10:15) [1]Может так можно :
Напиши скрипт или проц-у на Accesse которая сохраняла бы двоичные данные в виде файлов в их естественном формате.
Затем напишешь проц-ру уже для Делпфи которая открывает файлы грузит и сохраняет их в TOleContainer в базе данных ..
← →
sniknik © (2008-09-22 10:45) [2]> TOleContainer.LoadFromStream считает поток данных неверным.
как записали(/что) тем и считает, если ожидает не в том формате то естественно будут неверными.
но если у тебя, это с аксесовской базой работает, а mssql-ем нет, при одинаковых данных (сравнить бинарное представление)... то гдето ошибка, в твоем коде скорее всего.
← →
ЮЮ © (2008-09-22 10:58) [3]> но если у тебя, это с аксесовской базой работает, а mssql-
> ем нет, при одинаковых данных
Аccess одинаково правильно работает с данными как в mdb, так и на сервере (только не сохранеяет в таблице). Вопрос в том, как работать без Ассess-а.
← →
sniknik © (2008-09-22 11:15) [4]> Аccess одинаково правильно работает с данными как в mdb, так и на сервере (только не сохранеяет в таблице).
т.е. ты с аксесовской базы не можеш прочитать обьект? ну тогда точно ошибка в коде.
> Вопрос в том, как работать без Ассess-а.
вообщето аксесс как программа это лишнее звено при написании программ на дельфи. и работается без него совершенно спокойно, стандартными средствами.
тот же TOleContainer насколько помню использовал(вернее тестил, т.к. ни в один проект это не пошло) для чтения обьектов без особых проблем. да и какие могут быть проблемы? - обычное блоб поле, положил обьект, взял обьект, положил картинку взял тоже самое, главное не потерять что где, если читать картинку как обьект естественно будут ошибки.
← →
ЮЮ © (2008-09-22 11:43) [5]> т.е. ты с аксесовской базы не можеш прочитать обьект? ну
> тогда точно ошибка в коде.
Да нет никакого кода, ибо непонятно чем вытащить те бинарные данные
> положил обьект, взял обьект, положил картинку взял тоже
> самое
Что значит "положид/взял" объект?
TOleCantainer.LoadFromStrem не всилах взять из блоб-а нгичего вразумительного, ибо таи и объекта то нет.
Судя по диалогу загрузки объекта в контенер в IDE, надо сначала тип объекта выбрать.
A в блобе может оказаться и "точечный рисунок" и "документ MS Word".
← →
sniknik © (2008-09-22 13:18) [6]> A в блобе может оказаться и "точечный рисунок" и "документ MS Word".
а, вот в чем проблема... ну, это то у меня было просто, т.к. я под определенные типы пробовал (нужно было), а что за тип данных у меня был и так, не приходилось вытаскивать из префикса самого поля, а зная что за обьект лежит просто создаешь именно его и все
> OleCont.CreateObject("OWC11.Spreadsheet", false); //OWC11.PivotTable OWC11.Spreadsheet OWC11.ChartSpace Excel.Sheet
правда после отказался от TOleCantainer, проще оказалось импортировать мелкософтские обьекты чем с общим контейнером работать.
← →
ЮЮ © (2008-09-23 03:08) [7]Но даже с объектом "точечный рисунок" возникает коллизия: объект созданный и загруженный в MS Access и Delphi IDE (YOleContainer) оказываютя совершно разнвми (даже судя по заголовкам) и не понимающие лруг друга :(
Кстати, я говорил, что image не сохраняется мз access-а в таблицу MS SQL. Так вот там была экспортироована ненормализованная с кучей nvarchar полей таблица, среди которых было одно image поле. Аналогично, т.е. без изменений (и без ошибок), работали и запросы ч/з ADO. Вылечилось по наитию: вынес это поле в отдельную таблюцу и все заработало.
>правда после отказался от TOleCantainer, проще оказалось импортировать мелкософтские обьекты чем с общим контейнером работать.
Поделиться парой строчек, чтоб понять куда копать, не хочешь? :) Дело в том, что там с полтыши фотографий уже есть, да и формы пока аксесовские
использовать приходится.
← →
sniknik © (2008-09-23 11:09) [8]> объект созданный и загруженный в MS Access и Delphi IDE (YOleContainer) оказываютя
> совершно разнвми (даже судя по заголовкам) и не понимающие лруг друга :(
ну так, они и не должны совпадать, контейнер у аксесса может работать по другому (если он у него вообще есть).
есть гарантия только на то, что ты вытащишь то что положил
> обычное блоб поле, положил обьект, взял обьект, положил картинку взял тоже самое
а не то, что обьекты разных программ будут совпадать.
> Поделиться парой строчек, чтоб понять куда копать, не хочешь?
мой код тебе не поможет, но код проверки с TOleCantainer возможно (ниже), никаких проблем нет, если конечно читать то что писал а не что попало.
procedure TForm1.ButCreateObjectClick(Sender: TObject);
begin
OleContainer1.InsertObjectDialog();
end;
procedure TForm1.ButSaveObjectClick(Sender: TObject);
var
Stream: TStream;
begin
Stream:= TMemoryStream.Create;
try
OleContainer1.SaveToStream(Stream);
Stream.Position:= 0;
ADODataSet1.Edit;
TBlobField(ADODataSet1.FieldByName("Ole")).LoadFromStream(Stream);
ADODataSet1.Post;
finally
Stream.Free
end;
end;
procedure TForm1.ButLoadObjectClick(Sender: TObject);
var
Stream: TStream;
begin
Stream:= TMemoryStream.Create;
try
TBlobField(ADODataSet1.FieldByName("Ole")).SaveToStream(Stream);
Stream.Position:= 0;
OleContainer1.LoadFromStream(Stream);
finally
Stream.Free
end;
end;
создаешь рисунок/документ/... делаешь в нем чтонибудь сохраняешь, читаешь.
и совершенно неважно к чему подцеплен ADODataSet1 к аксессу, или mssql или любому другому sql серверу, лиш бы у него были блоб поля, работать должно везде.
← →
ЮЮ © (2008-09-24 10:56) [9]
> создаешь рисунок/документ/... делаешь в нем чтонибудь сохраняешь,
> читаешь.
Проблема в том, что там много понаписано аксессовским "точечным рисунком", который почему-то очень отличается от того "точечного рисунка", что создается в TOleContainer-е.
Вот как бы подружиться именно с аксессовским OLE-объектом?
← →
Anatoly Podgoretsky © (2008-09-24 10:57) [10]> ЮЮ (24.09.2008 10:56:09) [9]
Насколько я знаю, он отличается дополнительными байтами, перед данными.
← →
sniknik © (2008-09-24 11:33) [11]> который почему-то очень отличается от того "точечного рисунка", что создается в TOleContainer-е.
еще бы не отличался, один создан мелкософтом другой борландом, один просто обьект "указатель" на то какому приложению передать данные на открытие, другой контейнер для внедрения этого приложения к себе в программу, а уже в нем "указатель" и данные. причем и "указатель" не факт что по тому же принципу построен, что у мелкософта.
> Вот как бы подружиться именно с аксессовским OLE-объектом?
научиться читать также как аксесс. разобрать что означает у него префикс, и создавать соответствующий обьект самому.
кстати если это все ради какогото "точечного рисунка" то это куча усилий зря, достаточно откинуть префикс и останется "чистый" bmp файл (посфикс не влияет, откинется при открытии), загрузить его в image не проблема.
> Насколько я знаю, он отличается дополнительными байтами, перед данными.
байты обьекта контейнера, байты внедренного обьекта, собственно данные, постфикс внедренного обьекта, посфикс контейнера.
примерно так. (посфиксы возможно лишние, у меня просто оставались "лишние" байты после данных когда разбирался, решил что это постфикс)
← →
Anatoly Podgoretsky © (2008-09-24 12:56) [12]> sniknik (24.09.2008 11:33:11) [11]
Так и я не хочу ломать голову.
← →
ЮЮ © (2008-09-25 02:05) [13]> 10] Anatoly Podgoretsky © (24.09.08 10:57)
> [11] sniknik © (24.09.08 11:33)
Спасибо. Наверное так пока и поступлю, покв аксесс в прицепе.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2009.06.14;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.004 c