Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.10.29;
Скачать: CL | DM;

Вниз

Где объявлен тип TADOXCatalog?   Найти похожие ветки 

 
gedevan   (2015-11-30 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 ©   (2015-11-30 22:58) [1]

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


 
gedevan   (2015-12-01 01:17) [2]

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


 
gedevan   (2015-12-01 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   (2015-12-01 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   (2015-12-01 07:20) [5]

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

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


 
sniknik ©   (2015-12-01 10:23) [6]

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


 
sniknik ©   (2015-12-01 10:25) [7]

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


 
gedevan   (2015-12-01 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 ©   (2015-12-01 19:00) [9]

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


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

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

не понял...

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


 
sniknik ©   (2015-12-02 14:06) [11]

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

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

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


 
sniknik ©   (2015-12-02 14:10) [12]

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


 
gedevan   (2015-12-04 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 ©   (2015-12-04 13:59) [14]

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



Страницы: 1 вся ветка

Текущий архив: 2017.10.29;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.004 c
15-1467235801
Юрий
2016-06-30 00:30
2017.10.29
С днем рождения ! 30 июня 2016 четверг


15-1467236052
K-1000
2016-06-30 00:34
2017.10.29
MD5 из WinAPI


2-1448911691
gedevan
2015-11-30 22:28
2017.10.29
Где объявлен тип TADOXCatalog?


15-1467207680
Pavia
2016-06-29 16:41
2017.10.29
Множественная замена


2-1449064629
sollip
2015-12-02 16:57
2017.10.29
Abbrevia Xe10 lzma