Поля можуть створюватися і видалятися за допомогою функцій CreateField та DeleteField. Індекси для таблиці можуть бути створені або видалені викликом функцій CreateIndex та DeleteIndex. Інші функції можна використовувати для установки або отримання різних атрибутів таблиці, наприклад, GetFieldCount повертає кількість полів в таблиці, а SetValidationRule використовується для присвоєння полю умови перевірки на значення.
Крім цих основних класів DAO операції DAO використовують два додаткових класи: CDaoFieldExchange та CDaoException.
CDaoFieldExchangeвикористовується при звертаннях до CDaoRecordset::DoFieldExchange. Об’єкт типу СdaoFieldExchange визначає поле, що змінюється операцією обміну полями, та забезпечує інші параметри, що характерізують обмін полями.
Всі класи DAO використовують об’єкти виключення типу CDaoException для повідомлення про помилки.
Побудова застосування DAO.
.Для побудови застосування DAO необхідно перш за все створити джерело даних. Нехай ним буде база даних, створена в Microsoft Access. База даних Employee складається з 2 таблиць, де міститься інформація про працівників (їх ім’я та вік), та відомості про робочі плани (назва плану та максимальний вік робітника, якому буде дозволено займатися цим планом).
Створення застосування-DAO здійснено за допомогою AppWizard. Проект – однодокументний, в якості джерела даних (Data Source) вибано DAO, а дійсним файлом бази даних – базу даних Employee.
Структура застосування, яка створюється AppWizard схожа на відповідну для ODBC.
Новий клас CDAODBSet (DAODB – назва створюваного проекту)породжений від CDaoRecordset і представляє набір рядків, які будуть вибиратися з об’єднання всіх таблиць. AppWizard вставляє змінні, які відповідають стовпцям (полям) таблиць.
Об’явлення класу CDAODBSet:
class CDAODBSet : public CDaoRecordset
{
public:
CDAODBSet(CDaoDatabase* pDatabase = NULL);
DECLARE_DYNAMIC(CDAODBSet)
// Field/Param Data
//{{AFX_FIELD(CDAODBSet, CDaoRecordset)
Cstring m_LastName;
Cstring m_FirstName;
long m_Age;
Cstring m_Name;
long m_MaxAge;
//}}AFX_FIELD
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CDAODBSet)
public:
virtual Cstring GetDefaultDBName(); // REVIEW: Get a comment here
virtual Cstring GetDefaultSQL(); // default SQL for Recordset
virtual void DoFieldExchange(CDaoFieldExchange* pFX); // RFX support
//}}AFX_VIRTUAL
// Implementation
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CdumpContext& dc) const;
#endif
};
Реалізація класу CDAODBSet показує, як ці змінні ініціалізуються в конструкторі класу. Звертання до цих змінних є також в реалізації функції DoFieldExchange, сгенерованої мастером AppWizard. Ця функція здійснює обмін даними між змінними-членами в класі і полями в базі даних.
Реалізація класу CDAODBSet:
IMPLEMENT_DYNAMIC(CDAODBSet, CDaoRecordset)
CDAODBSet::CDAODBSet(CDaoDatabase* pdb)
: CDaoRecordset(pdb)
{
//{{AFX_FIELD_INIT(CDAODBSet)
m_LastName = _T(“”);
m_FirstName = _T(“”);
m_Age = 0;
m_Name = _T(“”);
m_MaxAge = 0;
m_nFields = 5;
//}}AFX_FIELD_INIT
m_nDefaultType = dbOpenDynaset;
}
Cstring CDAODBSet::GetDefaultDBName()
{
return _T(“D:\Visual Studio\MyProjects\DAODB\Employee1.mdb”);
}
Cstring CDAODBSet::GetDefaultSQL()
{
return _T(“[Employees],[Plans]”);
}
void CDAODBSet::DoFieldExchange(CDaoFieldExchange* pFX)
{
//{{AFX_FIELD_MAP(CDAODBSet)
pFX->SetFieldType(CDaoFieldExchange::outputColumn);
DFX_Text(pFX, _T(“[LastName]”), m_LastName);
DFX_Text(pFX, _T(“[FirstName]”), m_FirstName);
DFX_Long(pFX, _T(“[Age]”), m_Age);
DFX_Text(pFX, _T(“[Name]”), m_Name);
DFX_Long(pFX, _T(“[MaxAge]”), m_MaxAge);
//}}AFX_FIELD_MAP
}
Для виконання задачі DoFieldExchange використовує функції DFX_. Ці функції є DAO-аналогами функцій RFX_, що використовуються для обміну полями ODBC.
ФункціїDFX_.
Ім’я функції | Тип поля | Тип ODBC SQL |
FX_Binary | CByteArray | DAO_BYTES |
DFX_Bool | BOOL | DAO_BOOL |
DFX_Byte | BYTE | DAO_BYTES |
DFX_Currency | COleCurrency | DAO_CURENCY |
DFX_DateTime | COleDateTime | DAO_DATE |
DFX_Double | double | DAO_R8 |
DFX_Long | long | DAO_I4 |
DFX_LongBinary | CLongBinary | DAO_BYTES |
DFX_SHORT | ||
short | ||
DAO_I2 | ||
DFX_Single | ||
float | ||
DAO_R4 | ||
DFX_Text | ||
Cstring | ||
DAO_CHAR,DAO_WCHAR |
Клас документа CDAODBDoc містить нову змінну m_dAODBSet типу CDAODBSet. Ця змінна представляє набір записів, з якими пов’язаний документ. Клас перегляду CDAODBView містить вказівник типу CDAODBSet (m_pSet); в реалізації по замовченю він встановлений для вказівки на змінну m_dAODBSet об’єкта-документу. Клас перегляду також містить нову функцію OnGetrecordset, яка в реалізації по замовченню повертає m_pSet.
Настройка застосування.
В діалогове вікно IDD_DAODB_FORM додано відповідні статичні елементи керування та елементи керування редагуванням. За допомогою діалогового вікна Add Member Variable майстера ClassWizard ідентифікуємо змінні діалогового вікна відповідними змінними наборами записів. Це робиться за допомогою відповідної змінної m_pSet.
Для зміни критерія вибору можна скористатися функцією CDAODBSet::GetDefaultSQL. Реалізація цієї функції по замовченню повертає імена імена таблиць, з яких вибираються записи. В SQL потрібний нам вибір можна було б реалізувати:
SELECT Employees.LastName, Employees.FirstName, Employess.Age, Plans.Name, Plans.MaxAge
FROM Employees, Plans
Where Employees.Age<Plans.MaxAge
ORDER BY Employees.LastName, Employees.FirstName, Plans.Name
Вибрати відомості про прізвища та імена працівників, а також назви планів, для тих працівників, вік яких не перевищує максимальний вік, допустимий для цього плану.
При цьому вивід повинен бути відсортований спочатку за прізвищами працівників, потім за їх іменами, і накінець, за назвами планів.
Для ствоення відповідного запиту можна використовувати змінні класу CDaoRecordset. Цей клас пропонує дві змінні, одна з яких (m_strFilter) відповідає умові SQL WHERE , а інша (m_strSort) – умові SQLORDER BY.
Оновлення CDAODBSet::GetDefaultSQL
Cstring CDAODBSet::GetDefaultSQL()
{
m_strFilter=_T(“[Employees].[Age]<[Plans].[MaxAge]”);
m_strSort=_T(“[Employees].[LastName],[Employees].[FirstName],[Plans].[Name]”);
return _T(“[Employees],[Plans]”);
}
Застосування має такий вигляд:
За допомогою Component Galery до проекта було ще додано екранну заставку (Splash Screen)
Та системна інформація для діалогового вікна About (System Info for About Dialog).
Візуальні інстументи бази даних.
Visual C++ інтегрує в Visual Studio ряд інструментів, пов’язаних з базами даних. Тепер можна створювати бази даних, заповнювати таблиці, створювати і тестувати запити та відлагоджувати збережені процедури на віддаленому або локальному сервері, не залишаючи середовище Visual Studio.
Багато з можливостей розробки баз даних доступні для більшості джерел даних, інші, такі як створення таблиці, характені для Microsoft SQL Server.
Дві можливості представляють особливий інтерес. Перша – Query Designer, який дозволяє створювати і тестувати запити SQL з Visual Studio: друга – відладчик SQL, який дозволяє відлагоджувати збережені процедури, що виконуються на Microsoft SQL Server.
Для демонстації вищезазначених можливостей була створена база даних за допомогою Microsoft Access. Ця база містить дві таблиці: таблиця Books відображає книги з їх назвами, авторами та ISBN індексами; таблиця Authors містить відомості про авторів. Обидві таблиці з’єднуються відношенням – “багато-до-багатьох”: Books.Authors -> Authors.Name.
Для доступу до бази даних з Visual Studio необхідно створити проект бази даних (Database project). Доступ до джерела даних здійснюється через вказівку імені файлу джерела даних. Це файл – Books.DSN.
У вкладці FileView у вікні Workspace є лише один файл – файлове джерело даних (файл DSN):
У вкладці DataView можна побачити таблиці і поля, а також запити, якщо вони були створені:
Таким чином, тепер можна перевіряти і змінювати зміст таблиць, створювати SQL запити. Не можна створювати нові таблиці.
Для додавання або зміни даних достатньо двічі натиснути на відповідній таблиці у вкладці DataView. При цьому також з’являється вікно QUERY.
Створення запитів.
Побудуємо запит: вибрати всі книги, написані американськими авторами.
New Query можна створити натиснувши на імені бази даних у вкладці FileView:
Вибір таблиці здійснюється перетаскуванням відповідного імені таблиці з вікна DataView в вікно перегляду діаграм вікна Query. Встановлення з’єднання між полями – аналогічне (просте перетаскування):
Критерій вибору відображається в панелі сітки:
Панель SQL відображає відповідний SQL-запит:
Панель результатів відображає результати запитів:
Можна створювати не тільки запити-SELECT, а й INSERT, UPDATE, DELETE.
Запит UPDATE не має завершеного набору; при виконанні цього запиту Visual Studio в діалоговому вікні відображає тільки кількість записів, що були модифіковані:
Висновки.
В даній роботі, за допомогою створення власних прикладів, були розглянуті основні можливості програмування баз даних в Visual C++, зокрема використовуючи ODBC та DAO, а також можливості візуального конструювання баз даних.
Резюме:
ODBC – могутній, незалежний від постачальника механізм доступу до інформації з різних джерел даних.