Конференция "Начинающим" » Где объявлен тип TADOXCatalog?
 
  • gedevan (30.11.15 22:28) [0]
    Пытаюсь программно создавать базу данных Access, нашел мануалы, курю, но все что об этом написано датируется где то 2001-2003 годами. Похоже с тех пор что-то поменялось и я не могу объявить переменную типа TADOXCatalog, т.к. непонятно где этот тип описан. в ADODB его нет, в OLE DB тоже.

    Делфи xe5

    нашел еще такой вариант:


    function CreateAccessDatabase(FileName: string): string;
    var
        cat: OLEVariant;
    begin
      Result := '';
            try
             cat := CreateOleObject('ADOX.Catalog');      
             cat.Create('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + FileName + ';');    
             cat := NULL;
           except on e: Exception do
          Result := e.message;
          end;
    end;



    но вот первый мне как то больше нравится, и потом по нему хотя бы документация есть )

    как быть?
  • sniknik © (30.11.15 22:58) [1]
    > непонятно где этот тип описан.
    https://msdn.microsoft.com/en-us/library/ms678060%28v=vs.85%29.aspx
    в дельфе его нет (d7 и меньше, выше х.з. но вряд ли)
  • gedevan (01.12.15 01:17) [2]
    пишут что в ранних версиях делфи можно было как то сгенерировать включить в проект adox_tlb.pas, а в xe5 эта возможность сохранилась и как ее реализовать?
  • gedevan (01.12.15 04:35) [3]
    нашел файл в интернете и скачал. Возникла проблема


    const
      BaseName =   'c:\data\demo.mdb';
      DS          =   'Provider=Microsoft.Jet.OLEDB.4.0;Data    Source='+BaseName;
     
      var
      Catalog   : TADOXCatalog;
     
      ...
     
      // Создать экземпляр объекта ADOX Catalog
      Catalog   := CoCatalog.Create;
      // Если база данных существует, удалим ее
      If FileExists(BaseName) Then DeleteFile(BaseName);
      // Создадим новый MDB-файл
      Catalog.Create(DS);
      // Укажем активное соединение
      Catalog._Set_ActiveConnection(DS);
      ...



    В мануале такой вот код. Но компилятор ругается на строчку Catalog   := CoCatalog.Create;

    т.к. каталог объявлен как TADOXCatalog, а CoCatalog.Create возвращает тип _Catalog.

    И ладно так было бы только тут, но точно такая же беда и с таблицами и со всеми остальными объектами метаданных, похоже тут кроется какой то прием программирования о котором я ничего не знаю, просьба меня просвятить.

    Или этот компонент нужно зарегистрировать как пакет? а если я не хочу как пакет, хочу просто как модуль...
  • gedevan (01.12.15 07:13) [4]
    нашел в xe5 как этот файл импортировать/сгенерировать. Версию 6.0 сгенерировал. Пытаюсь ему скормить это:


    procedure Button3Click();
    const
     BaseName = 'c:\demo.mdb';
     DS = 'Provider=Microsoft.Jet.OLEDB.4.0;Data    Source=' + BaseName;

    var
     Catalog: _Catalog;
     Table  : _Table;
     Column :_Column;
    begin

     // Создать экземпляр объекта ADOX Catalog
     Catalog := CoCatalog.Create;
     // Если база данных существует, удалим ее
     If FileExists(BaseName) Then
       DeleteFile(BaseName);
     // Создадим новый MDB-файл
     Catalog.Create(DS);
     // Укажем активное соединение
     Catalog._Set_ActiveConnection(DS);

     // ШАГ 1
     // Создать новый экземпляр объекта Table
     Table := CoTable.Create;
     // Give it the name
     Table.Name := 'Customers';
     // И определить Catalog, к которому он принадлежит
     Table.ParentCatalog := Catalog;
     // ШАГ 2
     // Создать новый экземпляр объекта Column
     Column := CoColumn.Create;
     With Column do
     begin
       ParentCatalog := Catalog;
       // ШАГ 3
       // Установить свойства
       Name := 'CustID';
       Type_ := adInteger;
       Properties['Autoincrement'].Value := true;
       Properties['Description'].Value := 'Customer    ID';
     end;
     // ШАГ 4
     // Добавить поле к коллекции Columns объекта Table
     Table.Columns.Append(Column, 0, 0);
     Column := Nil;
     // ШАГ 5
     // Создать несколько объектов Columns и добавить их к объекту Table
     With Table.Columns do
     begin
       Append('FirstName', adVarWChar, 64);
       Append('LastName', adVarWChar, 64);
       Append('Phone', adVarWChar, 64);
       Append('Notes', adLongVarWChar, 128);
     end;
     // ШАГ 6
     // Добавить объект Table в коллекцию Tables объекта Catalog
     Catalog.Tables.Append(Table);
     Catalog := Nil;
    end;



    а он мне в строке Catalog.Create(DS); говорит:
    Невозможно найти устанавливаемый ISAM

    тогда я пишу
    DS = 'Provider=Microsoft.Jet.OLEDB.12.0;Data    Source=' + BaseName;

    а он мне выдает тогда что класс не зарегистрирован...что это?

    Функция вызывается какая то внешняя я так понял и ничего посмотреть нельзя что там происходит ( Офис 2007 установлен, но без аксесса. А чтобы базу эту юзать офис нужен обязательно?
  • gedevan (01.12.15 07:20) [5]
    убрал лишние пробелы в DS = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + BaseName;

    файл создался.....4.0 это максимальная сейчас? а говорят 12.0 это чего тогда?
  • sniknik © (01.12.15 10:23) [6]
    для 12й нужно устанавливать датабейсенжайн, они многое поменяли, а не просто версию... так он не не включен в установку винды, у него другое расширение... еще что-то.
  • sniknik © (01.12.15 10:25) [7]
    > тогда я пишу
    > DS = 'Provider=Microsoft.Jet.OLEDB.12.0;Data    Source=' + BaseName;
    Provider=Microsoft.ACE.OLEDB.12.0
  • gedevan (01.12.15 14:59) [8]

    With Table.Columns do
     begin
       Append('jpgSize', adBigInt, 0);
       Append('jpgPosition', adInteger, 0);
       Append('ShotNumber', adInteger, 0);
     end;



    тогда 12 не вариант.

    Почему оно ругается недопустимый тип на adBigInt? как мне сделать поле, чтобы в него влез int64? и еще а как сделать поле с типом blob?
  • sniknik © (01.12.15 19:00) [9]
    не вы...делывайся. используй ADO.
  • gedevan (02.12.15 13:30) [10]
    не вы...делывайся. используй ADO.



    не понял...

    Насколько я понял базу можно создать только через ADOX. Просто я только начал разбираться что с ADO, что ADOX.
  • sniknik © (02.12.15 14:06) [11]
    ADOX - низкий уровень, работа на уровне полей/индексов по именам/таблиц/базы (в файловом представлении)  и да создать базу у движка не имеющего sql команды CREATE DATABASE можно только через ADOX.

    ADO это все тоже самое, но на уровне sql, и более универсально (насколько вообще sql-и у движков сходятся)

    по сути ты учишься "кидать батоны" в дельфе но делать это пытаеся на встроенном ассемблере... зачем?
    базу создал? (код в 0 похож на рабочий) дальше подключайся и работай с ней с помощью ADO.
  • sniknik © (02.12.15 14:10) [12]
    > с помощью ADO.
    вот по нему в дельфе и справка, и компоненты и примеры, все есть.
  • gedevan (04.12.15 13:42) [13]
    procedure CreateBD(const baseName:string);
    //const
    //  BaseName2 = 'c:\demo.mdb';
    var
     Catalog: _Catalog;
     ds :string;
    begin
     If FileExists(BaseName) Then
       exit;//база уже создана
     DS := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + BaseName;
     // Создать экземпляр объекта ADOX Catalog
     Catalog := CoCatalog.Create;
     // Если база данных существует, удалим ее
     // Создадим новый MDB-файл
     Catalog.Create(DS);
     // Укажем активное соединение
     Catalog._Set_ActiveConnection(DS);
     Catalog := Nil;
    end;



    Сделал функцию, находится в отдельном модуле. Добавил этот модуль в 2 проекта. И вот в одном все компилируется и даже работает, а во втором выдает ошибку при компиляции на строку Catalog._Set_ActiveConnection(DS);

    [dcc32 Error] SQLWork.pas(49): E2010 Incompatible types: 'IDispatch' and 'string'

    что за бабуйня? как так?
  • sniknik © (04.12.15 13:59) [14]
    скорее тип описан в 2х модулях, и по разному... один перекрывает другой по порядку объявления.
    пиши так
    var
    Catalog: ИмяМодуля._Catalog;
 
Конференция "Начинающим" » Где объявлен тип TADOXCatalog?
Есть новые Нет новых   [134427   +38][b:0][p:0.003]