3.10 MyDAO: библиотека-оболочка для C++
Версия v0.1 (19-Feb-2000). Автор: Satish (spitfire@pn3.vsnl.net.in).
Лицензия: Feel free to use/copy/modify/add bugs/find bugs, but keep the author
informed.
Введение
Это C++ библиотека для сервера MySQL. Разработчик данного пакета искал
библиотеку C++, которая может создавать и работать с Data Access Objects. Он
натолкнулся на программное обеспечение, написанное Roland Hanel (MySQL C++) и Ed
Carp (MyC). Но MyC написан на чистом C и не может создавать объект в истинном
смысле. Также это не может создавать и работать с несколькими наборами
результатов. На основе этих пакетов была написан пакет MyDAO ver 0.1.
Руководство программиста
dbconnect class: Один объект подключения должен быть создан. Это ответственно
за соединение с сервером MySQL и открытие базы данных. Свойства:
- bool Connected;
Connected равно true, если подключение к серверу MySQL
работает.
- MYSQL *DBase;
DBase является указателем на структуру MYSQL. Это
требуется, чтобы открыть набор результатов.
Методы:
- void dbconnect::Connect(char *host, char *port, char *uname,
char*pwd);
Пытается соединиться с сервером MySQL, используя указанные
параметры хоста, порта, имени пользователя и пароля. Если подключение успешно
установлено, свойство Connected будет true.
- void dbconnect::Disconnect();
Разъединяет текущее подключение с
сервером MySQL.
- bool dbconnect::OpenDB(char *db);
Открывает базу данных db. Если все в
порядке, вернет true.
Пример:
dbconnect MyConnect;
char host[]="localhost";
char port[]="3306";
char name[]="satish";
char pwd[]="";
char db[]="orders";
MyConnect.Connect(host, port, name, pwd);
if (MyConnect.Connected) cout << "Connected" << endl;
else
{
cout << "Connection failed" << endl;
return;
}
if (!MyConnect.OpenDB(db)) {
cout << "Can not open selected database" << endl;
return;
}
else
{
cout << "Opened datbase: " << db << endl;
// open recorset(s)...
// Manipulate data...
}
MyConnect.Disconnect();
recordset class: Любое количество наборов результатов может быть создано из
этого класса. Он имеет много свойств для простого манипулирования данными.
Свойства:
- char RecSource[MAX_RECSRC_LEN];
Источник записей, из которых данные
должны обрабатываться. Это должна быть SQL-инструкция SELECT, возвращающая
записи.
- unsigned long int RecordCount;
Число строк в открытом наборе
результатов.
- unsigned long int AffectedRows;
Может использоваться только с Update,
AddNew или Delete. Число строк фактически обработанных сервером.
- bool EOR;
Конец набора результатов. True, если Вы двигаетесь в
последнюю строку.
- bool BOR;
Начало набора результатов. True, если Вы двигаетесь первую
строку. Замечание: EOR и BOR вместе будут равны true, если
RecordCount=0.
Методы:
- void recordset::OpenRecordset(MYSQL *Structmysql, char *sql);
Открывает
набор результатов основанный на SQL-инструкции select.
- void recordset::CloseRecordset();
Закрывает набор результатов. Он
должен быть закрыт, чтобы освободить память, используемую им.
- void recordset::MoveNext();
Перемещается в следующую строку набора
результатов. Если уже достигнута последняя строка, в ней и останется.
- void recordset::MovePrevious();
Перемещается в предыдущую строку набора
результатов. Если уже достигнута первая строка, в ней и останется.
- void recordset::MoveFirst();
Перемещается в первую строку набора
результатов.
- void recordset::MoveLast();
Перемещается в последнюю строку набора
результатов.
- char* recordset::GetField(char *FName);
Возвращает содержание поля
FName.
- void recordset::SetField(char *FName, char *Value);
Устанавливает
содержание поля FName в значение Value. Изменения будут отброшены, если после
установки значения не используется метод Update/AddNew.
- void recordset::Edit();
Должен использоваться перед методами SetField и
Update, иначе все изменения будет отброшены.
- void recordset::AddNew();
Используется, чтобы добавить новую строку в
набор результатов. Для работы этого метода набор результатов должен быть
основан на таблице. Метод Update должен использоваться после установки всех
значений поля. Определение WHERE не должно использоваться в методе Update,
если оно уже используется с методом AddNew. Свойство AffectedRows выдаст число
добавленных строк.
- void rercordset::Update(char *Where);
Используется, чтобы редактировать
или добавить строку вместе с методами Edit/AddNew. Определение WHERE не должно
использоваться с AddNew.
- void recordset::Delete(char *Where);
Применяется, чтобы удалить строки
из набора результатов.
- void recordset::Refresh();
Изменения, сделанные методом Update,
невидимы, если метод Refresh не используется. Обновите набор результатов
немедленно после Update.
- char* recordset::GetFieldN(int FNum);
Аналогично GetField, но вместо
имени поля используется его код (номер).
- void recordset::SetFieldN(int FNum, char *Value)
Аналогично SetField,
но вместо имени поля используется его код (номер).
Пример 1:
// Продолжение примера из dbconnect.
// Откроем таблицу заказчиков (customers) и распечатаем
// все записи из нее.
recordset MySet;
char sql[]="SELECT * FROM customers";
MySet.OpenRecordset(MyConnect.DBase, sql);
if (MySet.EOR && MySet.BOR){
cout << "No records found" << endl;
return;
}
else
{
// Show number of records
cout << "No. of records: " << MySet.RecordCount << endl;
// Show all records
while (!MySet.EOR)
{
cout << MySet.GetField("or_id") << "\t";
cout << MySet.GetField("customers") << "\t";
cout << MySet.GetField("city") << endl;
MySet.MoveNext();
}
}
Пример 2:
// Добавление новой строки в таблицу заказчиков.
MySet.AddNew();
MySet.SetField("cs_id", "7");
MySet.SetField("name", "Satish");
MySet.SetField("city", "Pune");
MySet.Update(""); // where не используется!
MySet.Refresh(); // Сделаем изменения видимыми.
Пример 3:
// Изменение имени заказчика.
MySet.Edit();
MySet.SetField("cs_id", "7");
MySet.SetField("name", "Suresh");
MySet.SetField("city", "Pune");
MySet.Update("or_id=7"); // where здесь необходимо использовать.
MySet.Refresh(); // Сделаем изменения видимыми.
Пример 4:
// Удаление записи.
MySet.Delete("name='Suresh'");
MySet.Refresh(); // Сделаем изменения видимыми.
Пример 5:
// Закроем набор результатов после употребления. Это ОБЯЗАТЕЛЬНО!
MySet.CloseRecordset();
Что еще надо сделать:
- Лучший контроль ошибок
- Методы поиска информации (FindFirst, FindNext, FindPrevious, FindLast)
- Сделать графическое представление набора результатов
содержание назад вперед