Платформы корпоративных информационных систем

         

Обработка запроса к базе данных



Пример 13-6. Обработка запроса к базе данных

Result "Connection::Query(char *sql) { T_RESULT *res; int state;

// Если нет соединения, делать нечего

if( !lsConnected(-) ) { throw "Соединения нет.";

}

// Выполнить запрос
#if defined(HAS_MSQL)

state = msqlQuery(connection, sql);
#elif defined(HAS_MYSQL)

state = mysql_query(connection, sql);


#else

#error Нет соединения с базой данных,
#endif

// Если произошла ошибка

if( state < 0 ) { throw GetError();

}

// Забрать результаты, если таковые имеются
#if defined(HAS_MSQL)

res = msqlStoreResult();
#elif defined(HAS_MYSQL)

res = mysql_store_result(connection);
#else

#error Нет соединения с базой данных,
#endif

// Если результат null, это было обновление или произошла ошибка
// Примечание: mSQL не порождает ошибки в msqlStoreResult()
if( res == (T_RESULT *)NULL ) {

// Установить значение affected_rows равным возвращенному msqlQuery()
#if defined(HAS_MSQL)

affected_rows = state;
#elif defined(HAS_MYSQL)

// field_count != 0 означает, что произошла ошибка
int field_count = mysql_num_fields(connection);

if( field_count != 0 )
{

throw GetError();
}
else
{

// Запомнить affected_rows
affected_rows = mysql_affected_rows(connection); }
#else

#error Нет соединения с базой данных,
#endif

//Возвратить NULL в случае обновления
return (Result *)NULL; }

// Для запроса возвратить экземпляр Result
return new Result(res); }

В начале обращения к базе данных делается вызов метода mysql_query() или msqlQuery() с передачей ему команды SQL, которую нужно выполнить. В случае ошибки оба API возвращают отличное от нуля значение. На следующем этапе вызываются mysql_store_result() или msqlStoreResult() , чтобы проверить, получены ли результаты, и сделать эти результаты доступными приложению. В этом месте две СУБД несколько отличаются в деталях обработки.

В mSQL API метод msqlStoreResult() не генерирует ошибки. Эту функцию приложение использует для того, чтобы поместить полученный результирующий набор в хранилище, управлять которым будет приложение, а не mSQL API. Иными словами, при вызове msqlQuery() результаты запоминаются во временной области памяти, управляемой API. Последующие вызовы msqlQuery() затирают эту область памяти. Чтобы сохранить результат в области памяти вашего приложения, нужно вызвать msqlStoreResult() .

Поскольку метод msqlStoreResult() не генерирует ошибку, при его вызове нужно рассматривать две возможности. Если обращение к базе данных было запросом, создавшим результирующий набор, то msqlStoreResult() возвращает указатель на структуру m_result, с которой может работать ваше приложение. При всех других типах обращения (обновление, вставка, удаление или создание) msqlStoreResult() возвращает NULL. Узнать количество строк, обработанных неизвлекающим данные запросом, можно из значения, возвращенного исходным вызовом msqlQuery() .

Подобно msqlStoreResult() , метод mysql_store_result() используется для запоминания данных, возвращенных запросом, в области памяти приложения, но, в отличие от версии для mSQL, необходимо создать для mysql_store_result() некий обработчик ошибок. Именно, значение NULL, возвращенное mysql_store_result() , может означать и то, что запрос не предполагал возвращение результирующего набора, и ошибку при получении последнего. Вызов метода mysql__num_f ields() позволит определить истинную причину. Отличное от 0 значение счетчика полей свидетельствует о происшедшей ошибке. Число измененных строк можно определить при обращении к методу mysql_affected_rows() .*



Содержание раздела