-
Пытаюсь программно создавать базу данных 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; но вот первый мне как то больше нравится, и потом по нему хотя бы документация есть ) как быть?
-
-
пишут что в ранних версиях делфи можно было как то сгенерировать включить в проект adox_tlb.pas, а в xe5 эта возможность сохранилась и как ее реализовать?
-
нашел файл в интернете и скачал. Возникла проблема
const
BaseName = 'c:\data\demo.mdb';
DS = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+BaseName;
var
Catalog : TADOXCatalog;
...
Catalog := CoCatalog.Create;
If FileExists(BaseName) Then DeleteFile(BaseName);
Catalog.Create(DS);
Catalog._Set_ActiveConnection(DS);
... В мануале такой вот код. Но компилятор ругается на строчку Catalog := CoCatalog.Create; т.к. каталог объявлен как TADOXCatalog, а CoCatalog.Create возвращает тип _Catalog. И ладно так было бы только тут, но точно такая же беда и с таблицами и со всеми остальными объектами метаданных, похоже тут кроется какой то прием программирования о котором я ничего не знаю, просьба меня просвятить. Или этот компонент нужно зарегистрировать как пакет? а если я не хочу как пакет, хочу просто как модуль...
-
нашел в 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
Catalog := CoCatalog.Create;
If FileExists(BaseName) Then
DeleteFile(BaseName);
Catalog.Create(DS);
Catalog._Set_ActiveConnection(DS);
Table := CoTable.Create;
Table.Name := 'Customers';
Table.ParentCatalog := Catalog;
Column := CoColumn.Create;
With Column do
begin
ParentCatalog := Catalog;
Name := 'CustID';
Type_ := adInteger;
Properties['Autoincrement'].Value := true;
Properties['Description'].Value := 'Customer ID';
end;
Table.Columns.Append(Column, 0, 0);
Column := Nil;
With Table.Columns do
begin
Append('FirstName', adVarWChar, 64);
Append('LastName', adVarWChar, 64);
Append('Phone', adVarWChar, 64);
Append('Notes', adLongVarWChar, 128);
end;
Catalog.Tables.Append(Table);
Catalog := Nil;
end; а он мне в строке Catalog.Create(DS); говорит: Невозможно найти устанавливаемый ISAM тогда я пишу DS = 'Provider=Microsoft.Jet.OLEDB.12.0;Data Source=' + BaseName; а он мне выдает тогда что класс не зарегистрирован...что это? Функция вызывается какая то внешняя я так понял и ничего посмотреть нельзя что там происходит ( Офис 2007 установлен, но без аксесса. А чтобы базу эту юзать офис нужен обязательно?
-
убрал лишние пробелы в DS = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + BaseName;
файл создался.....4.0 это максимальная сейчас? а говорят 12.0 это чего тогда?
-
для 12й нужно устанавливать датабейсенжайн, они многое поменяли, а не просто версию... так он не не включен в установку винды, у него другое расширение... еще что-то.
-
> тогда я пишу > DS = 'Provider=Microsoft.Jet.OLEDB.12.0;Data Source=' + BaseName; Provider=Microsoft.ACE.OLEDB.12.0
-
With Table.Columns do
begin
Append('jpgSize', adBigInt, 0);
Append('jpgPosition', adInteger, 0);
Append('ShotNumber', adInteger, 0);
end; тогда 12 не вариант. Почему оно ругается недопустимый тип на adBigInt? как мне сделать поле, чтобы в него влез int64? и еще а как сделать поле с типом blob?
-
не вы...делывайся. используй ADO.
-
не вы...делывайся. используй ADO. не понял... Насколько я понял базу можно создать только через ADOX. Просто я только начал разбираться что с ADO, что ADOX.
-
ADOX - низкий уровень, работа на уровне полей/индексов по именам/таблиц/базы (в файловом представлении) и да создать базу у движка не имеющего sql команды CREATE DATABASE можно только через ADOX.
ADO это все тоже самое, но на уровне sql, и более универсально (насколько вообще sql-и у движков сходятся)
по сути ты учишься "кидать батоны" в дельфе но делать это пытаеся на встроенном ассемблере... зачем? базу создал? (код в 0 похож на рабочий) дальше подключайся и работай с ней с помощью ADO.
-
> с помощью ADO. вот по нему в дельфе и справка, и компоненты и примеры, все есть.
-
procedure CreateBD(const baseName:string);
var
Catalog: _Catalog;
ds :string;
begin
If FileExists(BaseName) Then
exit; DS := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + BaseName;
Catalog := CoCatalog.Create;
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' что за бабуйня? как так?
-
скорее тип описан в 2х модулях, и по разному... один перекрывает другой по порядку объявления. пиши так var Catalog: ИмяМодуля._Catalog;
|