в чем смысл жизни.
C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как создать поле счетчика в базе данных MS Access
Владимир_
Отправлено: 15.10.2003, 15:06


Не зарегистрирован







Создаю поле счетчика в базе данных MS Access:
Tabl->TableType = ttDefault;
Tabl->FieldDefs->Clear();
TFieldDef *pNewDef;
pNewDef = Tabl->FieldDefs->AddFieldDef();
pNewDef->Name = "ID";
pNewDef->DataType = ftAutoInc;
pNewDef = Tabl->FieldDefs->AddFieldDef();
pNewDef->Name = "Name";
pNewDef->DataType = ftString;
pNewDef->Size = 40;
Tabl->CreateTable();

Вопервых определение TableType для Access в документации не нашел.
Создается таблица, но поле ID просто integer.
Как быть?
Admin
Отправлено: 15.10.2003, 19:55


Владимир

Группа: Администратор
Сообщений: 1190



Нашел вот что:

QUOTE

Зарезервированных слов для этого типа данных в MSAccess два: COUNTER(нач_значение, шаг) и IDENTITY(нач_значение, шаг).
Но настоятельно рекомендую отказаться от их использования -- будут проблемы при попытке переноса базы на серверную платформу.


Проверил — вот так работает:

CODE

void __fastcall TForm1::Button2Click(TObject *Sender)
{
Query1->SQL->Clear();
Query1->SQL->Add("CREATE TABLE \"MyTable\" (ID COUNTER(0,1),");
Query1->SQL->Add("Name CHAR(50),");
Query1->SQL->Add("PRIMARY KEY(ID))");
Query1->ExecSQL();

Query1->SQL->Clear();
Query1->SQL->Add("Insert into \"MyTable\" (Name) values('Kolia')");
Query1->ExecSQL();
Query1->SQL->Clear();
Query1->SQL->Add("Insert into \"MyTable\" (Name) values('Sasha')");
Query1->ExecSQL();
Query1->SQL->Clear();
Query1->SQL->Add("Insert into \"MyTable\" (Name) values('Maria')");
Query1->ExecSQL();
Query1->SQL->Clear();
Query1->SQL->Add("Insert into \"MyTable\" (Name) values('Lena')");
Query1->ExecSQL();

}
//-------------------------------


Поля ID действительно autoinc — все работает.
Как это проделать через Table — не знаю, если попробуете и
получиться — напишите как.

Отредактировано Admin — 15/10/2003, 21:02
Владимир_
Отправлено: 15.10.2003, 22:17


Не зарегистрирован







Спасибо.
У меня тоже только через Query1->SQL получается, а как выше — нет.
Но появилась очередная проблема — как быть с значением по умолчанию для созданного поля? Пробовал так:

Query1->SQL->Add("Name CHAR(50) DEFAULT='саша',"); — ругается.

Похоже у Access свой SQL-синтакс. Не подскажите, где его взять?
Как исправить?
** pasha
Отправлено: 16.10.2003, 20:32


Не зарегистрирован







Увы.

http://www.sql.ru/forum/actualthread.aspx?...?bid=20&otid=55
QUOTE

Их надо заново указать в соответствующем свойстве TField


---

Владимир_
Отправлено: 17.10.2003, 16:36


Не зарегистрирован







Появилась другая проблема работы с фильтром в Access:
Если делать так:

Table1->Filtered = false;
Table1->Filter = "ID=1";
Table1->Filtered = true;

то фильтр почему-то не работает.
А вот если так, то все в порядке, но слишком грубо:

Table1->Active = false;
Table1->Filter = "ID=1";
Table1->Filtered = true;
Table1->Active = true;

Это работает, но если после этого добавить строку:

Table1->Filtered = false;

То вылетает ошибка:

Table does not support this operation.

Что делать? Я так понимаю в CBuildere5 есть проблемы при работе через Table.
Опять пробовать через Query1->ExecSQL(); ???
Или может попробовать перейти на базу Visual FoxPro или dBase?
Посоветуйте что лучше сделать?
Я переделываю довольно громоздкую прогу с Paradox — сыпались индексы и вообще что-то интересное с таблицами творилось. Заказчик нервничает...

Влвдимир_
Отправлено: 18.10.2003, 17:03


Не зарегистрирован







Попробовал с базой Visual FoxPro — симптомы теже ...
Admin
Отправлено: 18.10.2003, 18:34


Владимир

Группа: Администратор
Сообщений: 1190



Думаю, что с Access лучше работать через компоненты с вкладки ADO,

без BDE. (и c FoxPro) или для FoxPro через сторонние компоненты

Apollo http://www.hotsoft.ru/VISTA/apollo_vcl.htm
или TDBF http://www.tdbf.net/


Владимир_
Отправлено: 19.10.2003, 15:47


Не зарегистрирован







Спасибо, буду пробовать с Access через ADO...

Вернуться в Работа с базами данных в C++Builder