|
public:
Result(T_RESULT *);
~Result();
void Close();
Row *GetCurrentRow();
int GetRowCount();
int Next(); };
#endif // l_result_h
Перемещение по результатам
Наш класс Result позволяет работать с результирующим набором построчно. Получив
экземпляр класса Result в результате обращения к методу Query() , приложение
должно последовательно вызывать Next() и GetCurrentRow(), пока очередной Next()
не возвратит 0. Пример 13-9 показывает, как выглядят эти действия для MySQL и
mSQL.
Пример 13-9. Перемещение по результирующему набору
int Result::Next() { T_ROW row;
if( result == (T_RESULT *)NULL ) {
throw "Результирующий набор закрыт.";
}
#if defined(HAS_MSQL)
row = msqlFetchRow(result);
#elif defined(HAS_MYSQL)
row = mysql_fetch_row(result);
#else
#error Нет соединения с базой данных,
#endif if( ! row )
{
current_row = (Row *)NULL;
return 0;
}
else
{
current_row = new Row(result, row);
return 1;
}
}
Row 'Result::GetCurrentRow()
{
if( result == (T_RESULT *)NULL )
{ throw "Результирующий набор закрыт.";
}
return current_row; }
Заголовочный файл row.h в примере 13-11 определяет T_ROW и T_RESULT в
зависимости от того, для какого ядра базы данных компилируется приложение.
Перемещение к следующей строке в обеих базах данных осуществляется одинаково и
просто. Вы вызываете mysql_fetch_row() или msqlFetchRow() . Если вызов
возвращает NULL, значит, необработанных строк не осталось.
В объектно-ориентированной среде это единственный тип навигации, которым вы
должны пользоваться. API для базы данных в объектно-ориентированном
программировании существует лишь для обеспечения извлечения данных, а не их
обработки. Обработка данных должна быть заключена в объектах доменов. Однако не
все приложения являются объектно-ориентированными. MySQL и mSQL предоставляют
функции, позволяющие перемещаться к определенным строкам в базе данных. Это
методы mysql_data_seek() mnsqlDataSeek() соответственно.
Освобождение ресурсов и подсчет строк
Приложения баз данных должны освобождать после себя ресурсы. Обсуждая класс
Connection, мы отметили, как результирующие наборы, порождаемые запросом,
помещаются в память, управляемую приложением. Метод Close() класса Result
освобождает память, занятую этим результатом. Пример 13-10 показывает, как
освободить ресурсы, занятые результатом, и получить количество строк в нем.
Пример 13-10. Освобождение ресурсов и подсчет числа строк
void Result::Close() {
if( result == (T_RESULT *)NULL ) { return;
}
#if defined(HAS_MSQL)
msqlFreeResult(result);
#elif defined(HAS_MYSQL)
mysql_free_result(result);
#else
#error Нет соединения с базой данных, ftendif
result = (TJESULT *)NULL; '
}
int Result::GetRowCount()
{
if( result == (T_RESULT *)NULL )
{
throw "Результирующий набор закрыт.";
}
if( row_count > -1 )
{
|
|