Форум: "Начинающим";
Текущий архив: 2017.10.29;
Скачать: [xml.tar.bz2];
ВнизГде объявлен тип 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.001 c