Приклад програми перегляду полів бази даних у CBuilder

Для того щоб створити програму перегляду полів бази даних, ви повинні дещо дізнатися про внутрішній устрій баз даних Для цього вам знадобиться база даних, з якою ви могли б працювати У нашому прикладі ми надамо користувачеві можливість вибрати базу даних з диска У даному випадку ми належимо обмеження на тип бази даних – це буде dBase, так що вам не доведеться хвилюватися з приводу встановлених драйверів ODBC, але все буде працювати точно так само і для будь-якого іншого типу баз даних з числа підтримуваних CBuilder

Після того як користувач вибрав базу даних, наступним кроком буде отримання інформації про полях Для здійснення задуманого ми використовуємо обєкт TTable (Таблиця) для відкриття конкретного файлу dBase, обраного користувачем Усередині обєкту TTable ви й знайдете інформацію про полях і індексах, присутніх в цій таблиці У першому прикладі ми не будемо цікавитися індексами, а тільки інформацією про полях

Усередині обєкту TTable міститься покажчик на обєкт TFieldDefs У цьому обєкті міститься масив обєктів опису полів типу TFieldDef (Один обєкт TFieldDefs містить безліч обєктів TFieldDef) Цей обєкт містить властивості, які представляють інформацію про кожному полі Серед іншого, всередині цього обєкта ви знайдете імя, тип і розмір поля Маючи всю цю інформацію, ми можемо приступити до створення програми перегляду, використовуючи форму, показану на рис 71

Створіть форму, показану на рис 71, додавши в порожню форму обєкти TStringGrid, TMainMenu, TOpenDialog і TTable У цьому прикладі ми не будемо безпосередньо встановлювати властивості обєктів grid, dialog або table Обєкт main menu повинен містити пункт Файл з підпунктами Відкрити і Вихід Пункт меню Відкрити використовуватиметься для вибору таблиці бази даних для перегляду, а пункт Вихід – для того, щоб закрити програму

Рис 71 Форма програми перегляду полів бази даних

Першим кроком для відображення інформації буде створення таблиці типів полів Типи полів зберігаються в базі даних як числові значення типу TFldType Нам би хотілося мати можливість відображати ці дані в більш Інформатіо ном вигляді, щоб користувач міг у них розібратися Для здійснення подібного перетворення додайте наступний код в початок вихідного файлу Unit1h:

typedef struct

{

int nCode char *strDesc

} DbFieldType

DbFieldType sFieldTypes[] =

{

{FtUnknown, Невідомо чи не визначено},

{FtString, Символьне або строкове поле},

{FtSmallint, 16-бітове ціле поле},

{FtInteger, 32-бітове ціле поле},

{FtWord, 16-бітове беззнаковое ціле поле},

{FtBoolean, Логічне поле},

{FtFloat, Поле чисел з плаваючою точкою},

{FtCurrency, Грошове поле},

{FtBCD, Двійково-кодоване десяткове поле},

{FtDate, Поле дати},

продовження І

Глава 7 • Робота з базами даних

{FtTime, Поле часу},

{FtDateTime, Поле дати і часу},

{FtBytes, Фіксована кількість байт (двійкове подання)},

{FtVarBytes, Змінна кількість байт (двійкове подання},

{FtAutoInc, Автоматично збільшується 32-бітове ціле поле лічильника},

{FtBlob, Поле Binary Large Object (великий двійковий обєкт)},

{FtMemo, Поле memo (рядок необмеженої довжини)},

{FtGraphic, Поле растрового малюнка},

{FtFmtMemo, Поле форматованого memo},

{FtParadoxOle, Поле Paradox OLE},

{FtDBaseOle, Поле dBase OLE},

{FtTypedBinary, типізувати двійкове поле},

{-1,&quot&quot}

}

Ця таблиця буде просто ставити у відповідність типи даних (символи ftxxx) і рядки, які характеризують тип поля Рядки будуть відображатися в сітці навпроти кожного поля як тип цього поля

Для того щоб здійснити перетворення типу поля в його опис, нам доведеться також додати в форму допоміжну функцію Назвемо її GetFieldTypeDescription Ця функція отримує один аргумент – тип поля та повертає рядок, що описує це поле Ось код, який необхідно додати в метод GetFieldTypeDescription:

char *TForm1::GetFieldTypeDescription(int nInd)

{

for (int i=0 sFieldTypes[i]nCode = -1 ++i) if (sFieldTypes[i]nCode == nInd)

return sFieldTypes[i]strDesc

return &quot"

}

Після того як типам полів поставлені у відповідність рядка, які й будуть використовуватися для виводу на екран, напишемо обробник відкриття бази даних і завантаження в сітку інформації з бази Напишемо обробник для команди меню Файл | Відкрити У метод форми Open1Click (Обробник для цієї команди меню) додайте наступні рядки:

void __fastcall TForm1::Open1Click(TObject *Sender)

{

OpenDialog1-> Filter = Файли баз даних dBase | * Dbf; if (OpenDialog1-> Execute ())

{

/ / Намагаємося відкрити обрану базу даних Розбираємося у внутрішньому устрої базданних Table1-> DatabaseName = ExtractFilePath (OpenDialog1-> FileName)

/ / Визначаємо імя таблиці

Table1-&gtTableName = ExtractFileName(OpenDialog1-&gtFileName)

/ / Робимо таблицю активної

Table1-&gtActive = true

/ / Завантажуємо сітку з частинами таблиці StringGrid1-> RowCount = Table1-> FieldCount StringGrid1-> ColCount = 4

/ / Встановлюємо ширину стовпців StringGrid1-> ColWidth [0] = 30 StringGrid1-> ColWidth [1] = StringGrid1-> ClientWidth / 3 – 10 StringGrid1-> ColWidth [2] = StringGrid1-> ClientWidth / 3 – 10 StringGrid1-> ColWidth [3] = StringGrid1-&gtClientWidth/3 – 10

/ / Встановлюємо заголовки StringGrid1-> Cells [0] [0] = № поля; StringGrid1-> Cells [0] [0] = Імя поля; StringGrid1-> Cells [0] [0] = Тип поля; StringGrid1-> Cells [0] [0] = Розмір; for (int i = 1 i FieldCount + + i)

{

StringGrid1-&gtCells[0][i] = AnsiString(i) StringGrid1-&gtCells[1][i] =

Table1-&gtFieldDefs-&gtItems[i]-&gtName StringGrid1-&gtCells[2][i] = GetFieldTypeDescription(Table1-&gt FieldDefs-&gtItems[i]-&gtDataType) StringGrid1-&gtCells[3][i] = AnsiString(Table1-&gtFieldDefs-&gt

Items[i]-&gtSize)

}

}

}

Деякі рядки наведеного вище коду – як, наприклад, що стосуються ініціалізації сітки або завдання ширини колонок – не уявляють собою нічого слож

ного Викликають труднощі є частини, що стосуються динамічного відкриття бази даних і отримання інформації з полів

Дві допоміжні функції, визначені в заголовному файлі sysutilshpp каталогу include \ vcl, використовуються для присвоєння імені бази даних та імені таблиці Імя бази даних для файлу dBase – це просто каталог, в якому цей файл знаходиться Аналогічно, імя таблиці

– Всього лише імя файлу, який ви збираєтеся відкрити

Обєкт TOpenDialog повертає повний шлях до обраного користувачем файлу у властивості FileName Ми знаємо, що обраний файл коректного типу, адже ми встановили властивість Filter так, щоб допустити лише файли dBase (DBF) Тому ми можемо використовувати допоміжну функцію ExtractFilePath для того, щоб отримати тільки імя каталогу, і допоміжну функцію ExtractFileName для отримання імені файлу з обраної таблицею Після того як обидві

функції були використані, ми «відкриваємо» базу даних, встановлюючи властивість Active1 в true

Хоча це і не показано в прикладі, вищенаведений код міг привести до виникнення виняткової ситуації Якщо ви хочете самі обробити цю виняткову ситуацію, встановлювати заново властивість Active всередині блоку try .. catch Можете робити що хочете всередині блоку catch, щоб дати зрозуміти користувачеві, що виникла помилка, і перервати виконання методу Якщо ж ви нічого не зробите, CBuilder автоматично обробить виняткову ситуацію і зупинить роботу програми

Після відкриття бази даних ми встановлюємо число рядків у сітці в значення, рівне що зберігається у властивості FieldCount числу полів Ця властивість представляє кількість полів, визначених в таблиці, до якої ви звернулися

У разі файлу dBase це те ж саме, що і загальна кількість полів в таблиці Після того як сітка ініційована, ширина і заголовки встановлені, одне за іншим опитуються поля і дані по кожному завантажуються в осередку клітини Якщо вам не доводилося використовувати клас TStringGrid раніше, чи не перевантажуйте себе зверненням до довідкової системи На Web-сайті фірми Borland знаходиться оновлений файл допомоги, який містить інформацію про сітку та кількох інших класах, випадково обійдених увагою як в довідковій системі, так і в паперовій документації У даному прикладі ми використовуємо властивість TStringGrid, Зване Cells (Комірки) для встановлення індивідуальних атрибутів рядків і стовпців сітки Якщо останнє твердження здалося вам забавним, не хвилюйтеся – чи ж не вам одному властивість Cells працює у форматі стовпець, рядок

Так само як це реалізовано в багатьох інших елементах системи, в обєкті FieldDefs окремі поля зберігаються у властивості Items (Частини, пункти) У властивості Items ви знайдете інформацію про імя поля (властивість Name), Типі поля (властивість DataField, Яке ми перетворимо в рядок за допомогою методу utility) І розмірі поля (властивість Size)

1 Якщо вам на очі попадеться англійська оригінал цієї книги, будьте обережні – у ній чомусь замість властивості Active згадується неіснуюче у TTable властивість Enable – Прямуючи перев

Для всіх полів, крім строкових (або масивів символів), властивість Size дорівнюватиме 0 Всі інші поля мають неявний розмір, що грунтується на їх реальному втіленні Наприклад, 16-бітове числове поле буде представлено 2-байтним цілим, а 32-бітове числове поле буде представлено 4-байтним цілим (або long) dBase вже знає про всі ці полях, так що тільки символьні рядкові поля повинні бути визначені за допомогою властивості Size

Остання річ в нашому коді, на яку варто звернути увагу, – це перетворення номера поля в рядок за допомогою класу AnsiString Хоча ми і розглянули клас string в STL, ми так толком і не поговорили про AnsiString Цей клас підтримує більшість методів класу string і використовується в ситуації, коли потрібно рядок типу прийнятої в мові Pascal Всі методи VCL, що працюють з рядками, допускають AnsiString в якості типу аргументу

Останнім кроком для завершення нашої програми буде здійснення її закриття при виборі команди меню Файл | Закрити Додайте новий обробник для команди меню Вихід, у відповідний метод Exit1Click додайте наступні рядки:

void __fastcall TForm1::Exit1Click(TObject *Sender)

{

Application-&gtTerminate()

}

На цьому програма перегляду баз даних успішно завершена Скомпілюйте ті і запустіть програму і виберіть базу даних для перегляду Хороші приклади можна знайти в підкаталозі CBuilder \ Examples \ Data основного каталогу CBuilder На рис 72 показано вікно програми перегляду з відображеним в ньому файлом Clientsdbf

Рис 72 Обрана користувачем база даних у вікні програми перегляду

Я сподіваюся, ви оцінили, наскільки потужний механізм підтримки баз даних в CBuilder і яку велику свободу дій він надає для роботи з базами даних В інших системах немає

можливості отримати безпосередньо ту інформацію, яку ви без праці почерпнули в обєкті

У нашому наступному прикладі, вивчаючи серйозне маніпулювання описами полів в процесі створення бази даних по критеріях, заданим користувачем, ми побачимо, наскільки потужними можуть виявитися обєкти TTable

Джерело: Теллес М – Borland C + + Builder Бібліотека програміста – 1998

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*