Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Где объявлен тип TADOXCatalog?


gedevan ©   (2015-11-30 22:28:00) 

Пытаюсь программно создавать базу данных 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   (2015-12-04 13:59:00) [1]

скорее тип описан в 2х модулях, и по разному... один перекрывает другой по порядку объявления.
пиши так
var
Catalog: ИмяМодуля._Catalog;


gedevan   (2015-12-04 13:42:00) [2]

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   (2015-12-02 14:10:00) [3]

> с помощью ADO.
вот по нему в дельфе и справка, и компоненты и примеры, все есть.


sniknik   (2015-12-02 14:06:00) [4]

ADOX - низкий уровень, работа на уровне полей/индексов по именам/таблиц/базы (в файловом представлении)  и да создать базу у движка не имеющего sql команды CREATE DATABASE можно только через ADOX.

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

по сути ты учишься "кидать батоны" в дельфе но делать это пытаеся на встроенном ассемблере... зачем?
базу создал? (код в 0 похож на рабочий) дальше подключайся и работай с ней с помощью ADO.


gedevan   (2015-12-02 13:30:00) [5]

не вы...делывайся. используй ADO.

не понял...

Насколько я понял базу можно создать только через ADOX. Просто я только начал разбираться что с ADO, что ADOX.


sniknik   (2015-12-01 19:00:00) [6]

не вы...делывайся. используй ADO.


gedevan   (2015-12-01 14:59:00) [7]


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


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

Почему оно ругается недопустимый тип на adBigInt? как мне сделать поле, чтобы в него влез int64? и еще а как сделать поле с типом blob?


sniknik   (2015-12-01 10:25:00) [8]

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


sniknik   (2015-12-01 10:23:00) [9]

для 12й нужно устанавливать датабейсенжайн, они многое поменяли, а не просто версию... так он не не включен в установку винды, у него другое расширение... еще что-то.


gedevan   (2015-12-01 07:20:00) [10]

убрал лишние пробелы в DS = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + BaseName;

файл создался.....4.0 это максимальная сейчас? а говорят 12.0 это чего тогда?


gedevan   (2015-12-01 07:13:00) [11]

нашел в 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   (2015-12-01 04:35:00) [12]

нашел файл в интернете и скачал. Возникла проблема


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   (2015-12-01 01:17:00) [13]

пишут что в ранних версиях делфи можно было как то сгенерировать включить в проект adox_tlb.pas, а в xe5 эта возможность сохранилась и как ее реализовать?


sniknik   (2015-11-30 22:58:00) [14]

> непонятно где этот тип описан.
https://msdn.microsoft.com/en-us/library/ms678060%28v=vs.85%29.aspx
в дельфе его нет (d7 и меньше, выше х.з. но вряд ли)


Наверх

Титульная страница Поиск, карта сайта Написать письмо