MySQL C API, используя результаты - PullRequest
2 голосов
/ 07 ноября 2008

Я использую MySQL C API для запроса базы данных, и у меня есть результаты, сохраненные в типах MYSQL_ROW. Я могу напечатать результаты на консоль с

printf("%s", row[0]);

однако, согласно документации MySQL C API, я не могу использовать их как строки с нулевым символом в конце.

Внизу обзор функций , они говорят, что я могу «извлечь» информацию с помощью mysql_store_result() или mysql_use_result(). Однако я все еще не понимаю, как это делается.

В идеале, я хочу использовать результаты в виде строки, чтобы я мог делать что-то вроде strcmp, но в противном случае мне определенно нужно как-то использовать информацию с этими двумя функциями.

Может кто-нибудь показать мне пример того, как это сделать?

1 Ответ

4 голосов
/ 07 ноября 2008

Обычно вы вызываете mysql_store_result () или mysql_use_result () для доступа к результирующему набору: первый загружает все строки в память на стороне клиента, а второй обращается к строкам по одному с сервера за раз. Если вы используете mysql_use_result (), вам нужно вызвать mysql_fetch_row () для доступа к каждой строке, пока функция не вернет NULL. Каждый успешный вызов mysql_fetch_row () будет возвращать MYSQL_ROW, который вы можете использовать для доступа к значениям отдельных полей.

Поскольку поля не заканчиваются нулем, вам нужно использовать mysql_fetch_lengths (), чтобы получить длины каждого из полей, чтобы вы могли скопировать их в другое место через memcpy и т. Д.

Поскольку значения полей не заканчиваются на нуль, вам нужно будет добавить свой собственный NUL-символ при создании копии, если вы хотите использовать его в качестве строки. Помните, что значения полей могут содержать двоичные данные, поэтому, если вы обрабатываете их как строку, функции, ожидающие, что строка C прекратит обработку данных, если в данных встретится нуль-символ.

Вот пример из документации, которая должна помочь вам собрать все это вместе:

MYSQL_ROW row;
unsigned int num_fields;
unsigned int i;

num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result)))
{
   unsigned long *lengths;
   lengths = mysql_fetch_lengths(result);
   for(i = 0; i < num_fields; i++)
   {
       printf("[%.*s] ", (int) lengths[i], 
              row[i] ? row[i] : "NULL");
   }
   printf("\n");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...