![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Где объявлен тип 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 и меньше, выше х.з. но вряд ли)