-
Ситуация такая: средствами Access-а был выполнен эксполт в таблицы на MS SQL. Поле стало типа image и Access все так же отображает из на формах из прилинкованных таблиц.
Однако возникли проблемы: Изменение (загрузка другой картинки) не сохраняется на сервере, хотя никаких ошибок Access не выдает. Идеально было бы воообще отказаться от Access-а, но возникает вопрос: чем докопаться до бинарных данных? TOleContainer.LoadFromStream считает поток данных неверным.
-
Может так можно : Напиши скрипт или проц-у на Accesse которая сохраняла бы двоичные данные в виде файлов в их естественном формате. Затем напишешь проц-ру уже для Делпфи которая открывает файлы грузит и сохраняет их в TOleContainer в базе данных ..
-
> TOleContainer.LoadFromStream считает поток данных неверным. как записали(/что) тем и считает, если ожидает не в том формате то естественно будут неверными. но если у тебя, это с аксесовской базой работает, а mssql-ем нет, при одинаковых данных (сравнить бинарное представление)... то гдето ошибка, в твоем коде скорее всего.
-
> но если у тебя, это с аксесовской базой работает, а mssql- > ем нет, при одинаковых данных
Аccess одинаково правильно работает с данными как в mdb, так и на сервере (только не сохранеяет в таблице). Вопрос в том, как работать без Ассess-а.
-
> Аccess одинаково правильно работает с данными как в mdb, так и на сервере (только не сохранеяет в таблице). т.е. ты с аксесовской базы не можеш прочитать обьект? ну тогда точно ошибка в коде.
> Вопрос в том, как работать без Ассess-а. вообщето аксесс как программа это лишнее звено при написании программ на дельфи. и работается без него совершенно спокойно, стандартными средствами. тот же TOleContainer насколько помню использовал(вернее тестил, т.к. ни в один проект это не пошло) для чтения обьектов без особых проблем. да и какие могут быть проблемы? - обычное блоб поле, положил обьект, взял обьект, положил картинку взял тоже самое, главное не потерять что где, если читать картинку как обьект естественно будут ошибки.
-
> т.е. ты с аксесовской базы не можеш прочитать обьект? ну > тогда точно ошибка в коде.
Да нет никакого кода, ибо непонятно чем вытащить те бинарные данные
> положил обьект, взял обьект, положил картинку взял тоже > самое
Что значит "положид/взял" объект? TOleCantainer.LoadFromStrem не всилах взять из блоб-а нгичего вразумительного, ибо таи и объекта то нет. Судя по диалогу загрузки объекта в контенер в IDE, надо сначала тип объекта выбрать. A в блобе может оказаться и "точечный рисунок" и "документ MS Word".
-
> A в блобе может оказаться и "точечный рисунок" и "документ MS Word". а, вот в чем проблема... ну, это то у меня было просто, т.к. я под определенные типы пробовал (нужно было), а что за тип данных у меня был и так, не приходилось вытаскивать из префикса самого поля, а зная что за обьект лежит просто создаешь именно его и все > OleCont.CreateObject('OWC11.Spreadsheet', false); //OWC11.PivotTable OWC11.Spreadsheet OWC11.ChartSpace Excel.Sheet правда после отказался от TOleCantainer, проще оказалось импортировать мелкософтские обьекты чем с общим контейнером работать.
-
Но даже с объектом "точечный рисунок" возникает коллизия: объект созданный и загруженный в MS Access и Delphi IDE (YOleContainer) оказываютя совершно разнвми (даже судя по заголовкам) и не понимающие лруг друга :(
Кстати, я говорил, что image не сохраняется мз access-а в таблицу MS SQL. Так вот там была экспортироована ненормализованная с кучей nvarchar полей таблица, среди которых было одно image поле. Аналогично, т.е. без изменений (и без ошибок), работали и запросы ч/з ADO. Вылечилось по наитию: вынес это поле в отдельную таблюцу и все заработало.
>правда после отказался от TOleCantainer, проще оказалось импортировать мелкософтские обьекты чем с общим контейнером работать.
Поделиться парой строчек, чтоб понять куда копать, не хочешь? :) Дело в том, что там с полтыши фотографий уже есть, да и формы пока аксесовские использовать приходится.
-
> объект созданный и загруженный в 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 серверу, лиш бы у него были блоб поля, работать должно везде.
-
> создаешь рисунок/документ/... делаешь в нем чтонибудь сохраняешь, > читаешь.
Проблема в том, что там много понаписано аксессовским "точечным рисунком", который почему-то очень отличается от того "точечного рисунка", что создается в TOleContainer-е.
Вот как бы подружиться именно с аксессовским OLE-объектом?
-
> ЮЮ (24.09.2008 10:56:09) [9]
Насколько я знаю, он отличается дополнительными байтами, перед данными.
-
> который почему-то очень отличается от того "точечного рисунка", что создается в TOleContainer-е. еще бы не отличался, один создан мелкософтом другой борландом, один просто обьект "указатель" на то какому приложению передать данные на открытие, другой контейнер для внедрения этого приложения к себе в программу, а уже в нем "указатель" и данные. причем и "указатель" не факт что по тому же принципу построен, что у мелкософта.
> Вот как бы подружиться именно с аксессовским OLE-объектом? научиться читать также как аксесс. разобрать что означает у него префикс, и создавать соответствующий обьект самому. кстати если это все ради какогото "точечного рисунка" то это куча усилий зря, достаточно откинуть префикс и останется "чистый" bmp файл (посфикс не влияет, откинется при открытии), загрузить его в image не проблема.
> Насколько я знаю, он отличается дополнительными байтами, перед данными. байты обьекта контейнера, байты внедренного обьекта, собственно данные, постфикс внедренного обьекта, посфикс контейнера. примерно так. (посфиксы возможно лишние, у меня просто оставались "лишние" байты после данных когда разбирался, решил что это постфикс)
-
> sniknik (24.09.2008 11:33:11) [11]
Так и я не хочу ломать голову.
-
> 10] Anatoly Podgoretsky © (24.09.08 10:57)
> [11] sniknik © (24.09.08 11:33)
Спасибо. Наверное так пока и поступлю, покв аксесс в прицепе.
|