|
state = msqlSelectDB(connection, "db_test");
/* опять-таки, -1 указывает на ошибку */
if( state == -1 )
{
printf(msqlErrMsg);
/* закрыть соединение перед выходом */
msqlClose(connection);
return 1; }
state = msqlQuery(connection, "SELECT test_id, test_val FROM test");
if( state == -1 )
{
printf(msqlErrMsg);
return 1;
}
else
{
printf("Строк: %d\n", state);
}
/* прежде чем делать новый вызов Query(),
* необходимо вызвать msqlStoreResult()
*/
result = msqlStoreResult();
/* обработать каждую строку результирующего набора */
while( ( row = msqlFetchRow(result)) != NULL )
{
printf("id: %s, значение: %s\n",
(row[0] ? row[0] : "NULL"),
(row[1] ? row[1] : "NULL"));
}
/* освободить ресурсы, использовавшиеся результирующим набором */
msqlFreeResult(result); /* закрыть соединение */
msqlClose(connect ion);
printf("Конец работы.\n"); }
Эти программы почти идентичны. Кроме разных имен функций, есть лишь несколько
заметных отличий. Сильнее всего бросается в глаза различие в соединении с базой
данных, которое проявляется в двух отношениях:
* В MySQL соединение осуществляется за один шаг, а в mSQL - за два.*
* Для MySQL требуются имя пользователя и пароль, а для mSQL -нет.
Как указывалось ранее в этой книге, MySQL поддерживает сложную схему
авторизации с именами пользователей и паролями. Напротив, в mSQL применяется
простая система, использующая ID пользователя процесса, соединяющегося с базой
данных. Более надежная схема MySQL гораздо привлекательнее в среде
клиент/сервер, но также и значительно более сложна в администрировании. Для
разработчиков приложений она означает необходимость передачи в вызове
mysql_real_connect() имени пользователя и пароля при работе с MySQL помимо
имени сервера, используемого в mSQL.
Первый аргумент API для установления соединения с MySQL может показаться
необычным. По сути, это способ отслеживать все вызовы, иначе никак не связанные
с соединением. Например, если вы пытаетесь установить соединение, и попытка
неудачна, вам нужно получить сообщение о соответствующей ошибке. Однако функция
MySQL
mysql_error() требует задания указателя на действующее соединение с базой
данных MySQL. Такое соединение обеспечивается изначально созданным нулевым
соединением. Однако у вас должна быть действующая ссылка на это значение в
течение всего времени существования вашего приложения - вопрос большой важности
в более структурированной среде, чем простое приложение вида «соединился,
сделал запрос, закрылся». Примеры на C++ далее в этой главе подробнее
рассматривают эту тему.
Два другие различия в API относятся к тому, как производятся обработка ошибок и
подсчет числа записей в результирующем наборе. API mSQL создает глобальную
переменную для хранения сообщений об ошибках. Из-за многопоточности MySQL такая
глобальная переменная не смогла бы действовать в его API. Поэтому в нем
используется функция mysql_error() для извлечения сообщений об ошибках,
связанных с последней ошибкой, порожденной указанным соединением.
API для соединения и обработки ошибок - два пункта, в которых MySQL отличается
от mSQL для обеспечения функциональности, отсутствующей в mSQL. Подсчет числа
результирующих записей в mSQL делается иным способом для обеспечения лучшего
интерфейса, нежели предоставляемый MySQL. А именно: при посылке SQL-запроса в
msqlQuery() возвращается число задействованных строк (или -1 в случае ошибки).
Таким образом, подсчет измененных строк при обновлении и строк в возвращаемом
результирующем наборе при запросе используют одну и ту же парадигму. В MySQL же
приходится использовать различные парадигмы. При запросе на получение данных
нужно передать результирующий набор функции mysql_nuoi_rows() , чтобы получить
число строк в результирующем наборе. При обновлении нужно вызвать другую
функцию API, mysql_affected_rows() . В то время как msqlQuery() возвращает
число строк, удовлетворивших предложению WHERE при обновлении,
mysql_affected_rows() сообщает о числе фактически измененных строк. И наконец,
в mSQL есть метод msqlNumRows() , обеспечивающий тот же интерфейс для подсчета
результирующего набора, что и в MySQL, но в нем нет аналога для
mysql_affected_rows() .
|
|