Druzya.org
Возьмемся за руки, Друзья...
 
 
Наши Друзья

Александр Градский
Мемориальный сайт Дольфи. 
				  Светлой памяти детей,
				  погибших  1 июня 2001 года, 
				  а также всем жертвам теракта возле 
				 Тель-Авивского Дельфинариума посвящается...

 
liveinternet.ru: показано количество просмотров и посетителей

Библиотека :: Компьютеры и Программирование :: Начинаем изучать MySQL
<<-[Весь Текст]
Страница: из 157
 <<-
 
позволит определить истинную причину. Отличное от 0 значение счетчика полей 
свидетельствует о происшедшей ошибке. Число измененных строк можно определить 
при обращении к методу mysql_affected_rows() .*
Другие методы класса Connection
По всему классу Connection разбросаны два вспомогательных метода, IsConnected() 
и GetError(). Проверить состояния соединения просто — достаточно посмотреть 
значение атрибута connection. Оно должно быть не NULL для MySQL или отличным от 
-1 для mSQL. Напротив, сообщения об ошибках требуют некоторых пояснений.
Извлечение сообщений об ошибках для mSQL просто и безыскусно, нужно лишь 
использовать значение глобальной переменной msqlErrMsg . Ее значение точно 
совпадает с тем, что возвращает от mSQL метод GetError(). С MySQL дело обстоит 
несколько сложнее. При обработке любых сообщений об ошибках необходимо 
учитывать многопоточность. В многопоточной среде обработка ошибок 
осуществляется путем получения сообщений об ошибках с помощью функции 
mysql_error() . В примере 13-7 показаны обработка ошибок для MySQL и mSQL в 
методе GetError(), а также проверка соединения в методе IsConnected() .
Пример 13-7. Чтение сообщений об ошибках и другие вспомогательные задачи класса 
Connection
int Connection::GetAffectedRows() {
return affected_rows; }
char 'Connection::GetError() { 
#if defined(HAS_MSQL)
return msqlErrMsg:
#elif defined(HAS_MYSQL)
if( IsConnected() ) {
return mysql_error(connection); }
else {
return mysql_error(&mysql); }
#else
#error Нет соединения с базой данных, 
#endif }
int Connection::IsConnected() { 
#if defined(HAS_MSQL)
return !(connection < 0);
#elif defined(HAS_MYSQL)
return !(iconnection);
#else
#error Нет соединения с базой данных,
#endif
)
Проблемы при обработке ошибок
Хотя обрабатывать ошибки, как это описано выше, несложно благодаря инкапсуляции 
обработки в простой вызов API в классе Connection , следует остерегаться 
некоторых потенциальных проблем. Во-первых, при работе с mSQL обработка ошибок 
осуществляется глобально в пределах приложения. Если приложение поддерживает 
несколько соединений, значение msqlErrMsg относится к последней ошибке 
последнего вызова какой-либо функции mSQL API. Следует также учесть, что хотя 
mSQL - однопоточное приложение, можно создавать многопоточные приложения, 
использующие mSQL, но проявлять крайнюю осторожность при извлечении сообщений 
об ошибках. Именно, необходимо написать собственный API, корректно работающий с 
потоками поверх mSQL С API, который копирует сообщения об ошибках и связывает 
их с соответствующими соединениями.
Обе СУБД управляют и сохраняют сообщения об ошибках внутри своих 
соответствующих API. Поскольку вы не распоряжаетесь этой деятельностью, может 
возникнуть другая проблема, связанная с запоминанием сообщений об ошибках. В 
нашем C++ API обработка ошибок . происходит сразу после их возникновения и до 
того, как приложение сделает новое обращение к базе данных. Если мы хотим 
продолжить обработку и лишь позднее заняться ошибками, сообщение об ошибке 
следует скопировать в область памяти нашего приложения.
Результирующие наборы
Класс Result абстрагируется от понятий результатов MySQL и mSQL. Он должен 
обеспечивать доступ как к данным результирующего набора, так и к сопутствующим 
этому набору метаданным. Согласно объектной модели на рис. 13-1, наш класс 
Result будет поддерживать циклический просмотр строк результирующего набора и 
получение числа строк в нем. Ниже в примере 13-8 приведен заголовочный файл 
класса Result.
Пример 13-8. Интерфейс класса Result в result.h
#ifndef 1_result_h 
#define 1_result_h
#include 
#if defined(HASJSQL)
#include  
#elif defined(HAS_MYSQl) 
#include  
#endif
#include "row.h"
class Result { private:
int row_count;
T_RESULT *result;
Row *current_row;
 
<<-[Весь Текст]
Страница: из 157
 <<-