Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++_навч_пос14_new.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
1.86 Mб
Скачать

4.9 Робота з базами даних

Робота з базами даних у C++ Builder за допомогою BDE

(TDataSource, TDatabase, TTable, TQuery, TDBGrid, TDBNavigator)

1 Створіть базу даних Paradox за допомогою Database Desktop. Запустіть програму C:\Program Files\Common Files\Borland Shared\Database Desktop\dbd32.exe

2 Створіть нову таблицю File/New/Table.../Paradox 7

3 Створіть поля таблиці (рис.) і збережіть її як C:\My_db \table1.bd

4 Визначте другий індекс і назвіть його n

5 Заповніть записи таблиці (рис.)

6 Виберіть в меню Tools/Alias Manager...(рис.) Задайте псевдонім бази (my), тип драйверу, шлях до таблиць та натисніть Keep New.

7 Створіть проект C++ Builder (File|New| Application)

8 Помістіть на форму такі компоненти: TDBGrid, TDBNavigator, TButton (5 штук), TDataSource, TTable, TQuery.

9 Властивості компонентів для роботи з базами даних можна виставити вже на етапі проектування і вже на етапі проектування переглядати вміст бази даних, але в даному випадку, з навчальною метою, значення властивостей задаються в коді програми.

10 Заповніть код програми:

//обробник події створення форми

void __fastcall TForm1::FormCreate(TObject *Sender)

{

Table1->Active=false;//деактивувати таблицю

DataSource1->DataSet=Table1;//вказати набір даних для джерела даних

DBGrid1->DataSource=DataSource1;//вказати джерело даних для таблиці

DBGrid1->Width=Form1->ClientWidth;//установити ширину таблиці

DBNavigator1->DataSource=DataSource1;//вказати джерело даних для навігатора

DBNavigator1->ShowHint=true;//показувати підказки кнопок

Table1->DatabaseName="my";//псевдонім БД

Table1->TableName="table1.db";//таблиця БД

Table1->Active=true;//активувати таблицю

Table1->IndexName="n";//задати ім'я індексу

Table1->Fields->Fields[0]->Visible=false;//сховати поле 0

Table1->FieldByName("Name")->DisplayLabel="Прізвище";//змінити надпис поля Name

Table1->Fields->Fields[2]->DisplayLabel="Група";//змінити надпис поля 2

Table1->Fields->Fields[3]->DisplayLabel="Бал";//змінити надпис поля 3

Table1->EnableConstraints();//дозволити обмеження

//установити обмеження для поля 3

Table1->Fields->Fields[3]->CustomConstraint="x>=0 and x<=5";

Table1->Fields->Fields[3]->ConstraintErrorMessage="!";

DBGrid1->Columns->Items[2]->ButtonStyle=cbsAuto;//стиль колонки 2

//список вибору колонки 2

DBGrid1->Columns->Items[2]->PickList->Add(3);

DBGrid1->Columns->Items[2]->PickList->Add(4);

DBGrid1->Columns->Items[2]->PickList->Add(5);

//змінити надписи на кнопках

Button1->Caption="Insert";

Button2->Caption="Filter";

Button3->Caption="Edit";

Button4->Caption="Find";

Button5->Caption="Query";

TStringList *ss=new TStringList;

Session->GetAliasNames(ss);//записати у список імена псевдонімів БД

Session->GetTableNames("my","",true,false,ss);//записати у список імена таблиць БД my

}

//обробник події натиску на кнопці Button1

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Table1->Insert();//вставити запис

//заповнити поля

Table1->FieldByName("Name")->AsString="Шевченко";

Table1->FieldByName("Group")->AsInteger=2;

Table1->FieldByName("B")->AsFloat=3.8;

Table1->Post();//надіслати у БД

//заборонити зміну поля Group

Table1->FieldByName("Group")->ReadOnly=true;

}

//обробник події натиску на кнопці Button2

void __fastcall TForm1::Button2Click(TObject *Sender)

{

if (Table1->Filtered)//якщо дані фільтровані

{Table1->Filtered=false;//відмінити фільтрацію

Table1->CancelRange();}//відмінити діапазони

else//інакше

{Table1->Filter="(Group=1)and(B<5)";//фільтр мовою SQL

Table1->Filtered=true;//установити фільтрацію

Table1->IndexFieldNames="Name";//ім'я поля індексу

Table1->SetRange(&TVarRec("Н"),0,&TVarRec("Я"),0);//установити діапазон імен від Н до Я

}

}

//обробник події натиску на кнопці Button3

void __fastcall TForm1::Button3Click(TObject *Sender)

{

String s="Мельник";//рядок

Table1->Edit();//редагувати

Table1->FieldByName("Name")->AsString=s;//запис у поле рядка

int i=Table1->FieldByName("Group")->AsInteger;//читання поля

Table1->FieldByName("B")->AsFloat=4.1;//запис у поле дійсного числа

Table1->Post();//надіслати у БД

}

//обробник події натиску на кнопці Button4

void __fastcall TForm1::Button4Click(TObject *Sender)

{

//перший варіант пошуку

String s="Мельник";//рядок

Table1->First();//перехід до першого запису

while (!Table1->Eof)//поки не кінець таблиці

{

//якщо вміст поля Name=s, видалити цей запис

if(Table1->FieldByName("Name")->AsString==s)Table1->Delete();

Table1->Next();//перехід по наступного запису

}

//другий варіант пошуку

bool find=false;//булева змінна

TLocateOptions options;//опції пошуку

//часткове співпадання і нечутливість до регістру

options<<loPartialKey<<loCaseInsensitive;

//результат пошуку в полі Name присвоїти змінній find

find=Table1->Locate("Name","Шевченко",options);

//або пошук по кільком полям

find=false;

Variant v[]={"Шевченко","1"};

//результат пошуку в полях Name і Group присвоїти find

find=Table1->Locate("Name;Group",VarArrayOf(v,1),options);

//третій варіант пошуку

//присвоїти змінній b вміст поля B знайденого запису

float b=StrToFloat(Table1->Lookup("Name","Шевченко","B"));

//четвертий варіант пошуку

Table1->IndexFieldNames="Name;Group";

//перемістити курсор до найбільш подібного запису

Table1->FindNearest(OPENARRAY(TVarRec,("Шевченко","1")));

}

//обробник події натиску на кнопці Button5

void __fastcall TForm1::Button5Click(TObject *Sender)

{

Table1->Active=false;//деактивувати таблицю

Query1->DatabaseName=Table1->DatabaseName;//псевдонім БД для запиту

DataSource1->DataSet=Query1;//вказати набір даних для джерела даних

//створити параметр P

TParam *p = Query1->Params->CreateParam(ftFloat, "P", ptInput);

p->AsFloat = 4.1;//присвоїти число

//сформувати рядок динамічного запиту SQL з параметром

String s="SELECT * FROM table1 WHERE (B>:P)";

try

{

Query1->SQL->Clear();//очистити рядки команд SQL

Query1->SQL->Add(s);//добавити рядок команди SQL

Query1->Open();//виконати запит

}

catch (EDatabaseError&)//при помилці

{Query1->ExecSQL();}//виконати інші команди SQL (крім SELECT)

delete p;//знищити p

}

//обробник події, яка виникає перед записом у БД

void __fastcall TForm1::Table1BeforePost(TDataSet *DataSet)

{

//якщо не вибрана кнопка YES

if (Application->MessageBoxA("Записати?","",MB_YESNOCANCEL)!=IDYES)

{

DataSet->Cancel();//відмінити зміни

Abort();

}

}