Конференция "Базы" » MS Access-овские OLE-объекты. Как с ними работать без Access-а?
 
  • ЮЮ © (22.09.08 09:01) [0]
    Ситуация такая: средствами Access-а был выполнен эксполт в таблицы на MS SQL. Поле стало типа image и Access все так же отображает из на формах из прилинкованных таблиц.

    Однако возникли проблемы:
     Изменение (загрузка другой картинки) не сохраняется на сервере, хотя никаких ошибок Access не выдает. Идеально было бы воообще отказаться от Access-а, но возникает вопрос: чем докопаться до бинарных данных? TOleContainer.LoadFromStream считает поток данных неверным.
  • damp (22.09.08 10:15) [1]
    Может так можно :
    Напиши скрипт или проц-у на Accesse которая сохраняла бы двоичные данные в виде файлов в их естественном формате.
    Затем напишешь проц-ру уже для Делпфи которая открывает файлы грузит и сохраняет их в TOleContainer в базе данных ..
  • sniknik © (22.09.08 10:45) [2]
    > TOleContainer.LoadFromStream считает поток данных неверным.
    как записали(/что) тем и считает, если ожидает не в том формате то естественно будут неверными.
    но если у тебя, это с аксесовской базой работает, а mssql-ем нет, при одинаковых данных (сравнить бинарное представление)... то гдето ошибка, в твоем коде скорее всего.
  • ЮЮ © (22.09.08 10:58) [3]
    > но если у тебя, это с аксесовской базой работает, а mssql-
    > ем нет, при одинаковых данных


    Аccess одинаково правильно работает с данными как в mdb, так и на сервере (только не сохранеяет в таблице). Вопрос в том, как работать без Ассess-а.
  • sniknik © (22.09.08 11:15) [4]
    > Аccess одинаково правильно работает с данными как в mdb, так и на сервере (только не сохранеяет в таблице).
    т.е. ты с аксесовской базы не можеш прочитать обьект? ну тогда точно ошибка в коде.

    > Вопрос в том, как работать без Ассess-а.
    вообщето аксесс как программа это лишнее звено при написании программ на дельфи. и работается без него совершенно спокойно, стандартными средствами.
    тот же TOleContainer насколько помню использовал(вернее тестил, т.к. ни в один проект это не пошло) для чтения обьектов без особых проблем. да и какие могут быть проблемы? - обычное блоб поле, положил обьект, взял обьект, положил картинку взял тоже самое, главное не потерять что где, если читать картинку как обьект естественно будут ошибки.
  • ЮЮ © (22.09.08 11:43) [5]
    > т.е. ты с аксесовской базы не можеш прочитать обьект? ну
    > тогда точно ошибка в коде.

    Да нет никакого кода, ибо непонятно чем вытащить те бинарные данные


    > положил обьект, взял обьект, положил картинку взял тоже
    > самое

    Что значит "положид/взял" объект?
    TOleCantainer.LoadFromStrem не всилах взять из блоб-а нгичего вразумительного, ибо таи и объекта то нет.
    Судя по диалогу загрузки объекта в контенер в IDE, надо сначала тип объекта выбрать.
    A в блобе может оказаться и "точечный рисунок" и "документ MS Word".
  • sniknik © (22.09.08 13:18) [6]
    > A в блобе может оказаться и "точечный рисунок" и "документ MS Word".
    а, вот в чем проблема... ну, это то у меня было просто, т.к. я под определенные типы пробовал (нужно было), а что за тип данных у меня был и так, не приходилось вытаскивать из префикса самого поля, а зная что за обьект лежит просто создаешь именно его и все
    > OleCont.CreateObject('OWC11.Spreadsheet', false); //OWC11.PivotTable OWC11.Spreadsheet OWC11.ChartSpace Excel.Sheet
    правда после отказался от TOleCantainer, проще оказалось импортировать мелкософтские обьекты чем с общим контейнером работать.
  • ЮЮ © (23.09.08 03:08) [7]
    Но даже с объектом "точечный рисунок" возникает коллизия: объект созданный и загруженный в MS Access и Delphi IDE (YOleContainer) оказываютя совершно разнвми (даже судя по заголовкам) и не понимающие лруг друга :(

    Кстати, я говорил, что image не сохраняется мз access-а в таблицу MS SQL. Так вот там была экспортироована ненормализованная с кучей nvarchar полей таблица, среди которых было одно image поле. Аналогично, т.е. без изменений (и без ошибок), работали и запросы ч/з ADO. Вылечилось по наитию: вынес это поле в отдельную таблюцу и все заработало.  

    >правда после отказался от TOleCantainer, проще оказалось импортировать мелкософтские обьекты чем с общим контейнером работать.

    Поделиться парой строчек, чтоб понять куда копать, не хочешь? :) Дело в том, что там с полтыши фотографий уже есть, да и формы пока аксесовские
    использовать приходится.
  • sniknik © (23.09.08 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 серверу, лиш бы у него были блоб поля, работать должно везде.
  • ЮЮ © (24.09.08 10:56) [9]

    > создаешь рисунок/документ/... делаешь в нем чтонибудь сохраняешь,
    >  читаешь.


    Проблема в том, что там много понаписано аксессовским "точечным рисунком", который почему-то очень отличается от того "точечного рисунка", что создается в TOleContainer-е.

    Вот как бы подружиться именно с аксессовским OLE-объектом?
  • Anatoly Podgoretsky © (24.09.08 10:57) [10]
    > ЮЮ  (24.09.2008 10:56:09)  [9]

    Насколько я знаю, он отличается дополнительными байтами, перед данными.
  • sniknik © (24.09.08 11:33) [11]
    > который почему-то очень отличается от того "точечного рисунка", что создается в TOleContainer-е.
    еще бы не отличался, один создан мелкософтом другой борландом, один просто обьект "указатель" на то какому приложению передать данные на открытие, другой контейнер для внедрения этого приложения к себе в программу, а уже в нем "указатель" и данные. причем и "указатель" не факт что по тому же принципу построен, что у мелкософта.

    > Вот как бы подружиться именно с аксессовским OLE-объектом?
    научиться читать также как аксесс. разобрать что означает у него префикс, и создавать соответствующий обьект самому.
    кстати если это все ради какогото "точечного рисунка" то это куча усилий зря, достаточно откинуть префикс и останется "чистый" bmp файл (посфикс не влияет, откинется при открытии), загрузить его в image не проблема.

    > Насколько я знаю, он отличается дополнительными байтами, перед данными.
    байты обьекта контейнера, байты внедренного обьекта, собственно данные, постфикс внедренного обьекта, посфикс контейнера.
    примерно так. (посфиксы возможно лишние, у меня просто оставались "лишние" байты после данных когда разбирался, решил что это постфикс)
  • Anatoly Podgoretsky © (24.09.08 12:56) [12]
    > sniknik  (24.09.2008 11:33:11)  [11]

    Так и я не хочу ломать голову.
  • ЮЮ © (25.09.08 02:05) [13]
    > 10] Anatoly Podgoretsky ©   (24.09.08 10:57)


    > [11] sniknik ©   (24.09.08 11:33)


    Спасибо. Наверное так пока и поступлю, покв аксесс в прицепе.
 
Конференция "Базы" » MS Access-овские OLE-объекты. Как с ними работать без Access-а?
Есть новые Нет новых   [134473   +28][b:0][p:0.001]