Несколько mysql_real_query () в цикле while

Кажется, что когда у меня есть одна функция mysql_real_query () в непрерывном цикле while, запрос будет выполнен нормально.

Однако, если несколько mysql_real_query () находятся внутри цикла while, одна сразу за другой. В зависимости от запроса иногда ни первый, ни второй запрос не будут выполняться должным образом.

Мне это кажется проблемой с потоками. Мне интересно, есть ли у mysql c api способ справиться с этим? Кто-нибудь знает, как с этим бороться? mysql_free_result () не работает, так как я даже не сохраняю результаты.

//keep polling as long as stop character '-' is not read
while(szRxChar != '-')
{
    // Check if a read is outstanding
    if (HasOverlappedIoCompleted(&ovRead))
    {
        // Issue a serial port read
        if (!ReadFile(hSerial,&szRxChar,1,
                &dwBytesRead,&ovRead))
        {
            DWORD dwErr = GetLastError();
            if (dwErr!=ERROR_IO_PENDING)
                return dwErr;
        }
    }

    // Wait 5 seconds for serial input
    if (!(HasOverlappedIoCompleted(&ovRead)))
    {
        WaitForSingleObject(hReadEvent,RESET_TIME);
    }

    // Check if serial input has arrived
    if (GetOverlappedResult(hSerial,&ovRead,
            &dwBytesRead,FALSE))
    {
        // Wait for the write
        GetOverlappedResult(hSerial,&ovWrite,
            &dwBytesWritten,TRUE);

        //load tagBuffer with byte stream
        tagBuffer[i] = szRxChar;
        i++;
        tagBuffer[i] = 0; //char arrays are \0 terminated

        //run query with tagBuffer
        if ( strlen(tagBuffer)==PACKET_LENGTH )
        {
            sprintf(query,"insert into scan (rfidnum) values ('");
            strcat(query, tagBuffer);
            strcat(query, "')");
            mysql_real_query(&mysql,query,(unsigned int)strlen(query));

            i=0;
        }

        mysql_real_query(&mysql,"insert into scan (rfidnum) values ('2nd query')",(unsigned int)strlen("insert into scan (rfid) values ('2nd query')"));

        mysql_free_result(res);
    }
}

ваш второй запрос действительно еще одна вставка?

Alnitak 12.11.2008 00:57

Да, я пробовал как вставить, так и выбрать. Если это выбор, кажется, что из первого запроса ничего не вставляется. Если это вставка, будет вставлен только один кортеж.

Steve 12.11.2008 01:04

mysql_free_res следует использовать только в результате запроса, который производит данные строки. "вставки" этого не делают.

Alnitak 12.11.2008 01:16
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
3
3
3 466
2

Ответы 2

Хорошо, в тестовых целях возьмите свою переменную tagBuffer из первого вызова mysql_real_query и замените ее константой, как ваш второй тестовый запрос.

В этот момент вы просто будете многократно вставлять две постоянные строки. Этот В самом деле должен работать.

Если это сработает, то мы должны выяснить, что не так с tagBuffer. Может ли он получать необычные символы, которые каким-то образом сбивают с толку MySQL, но не были обнаружены в одном случае запроса?

Я только что попробовал ваше предложение. К сожалению, с tagBuffer я получил тот же результат, что и при вставке константы. Единственная разница в том, что теперь моя «1-я» константа не появляется снова, когда я добавляю второй запрос.

Steve 12.11.2008 01:12

Хорошо, затем перейдите к ответу Билла и проверьте коды ошибок MySQL.

Alnitak 12.11.2008 01:34

Всегда проверяйте возвращаемое значение вызова API.

mysql_real_query() возвращает целое число. Значение равно нулю, если вызов сработал, и отличному от нуля, если произошла ошибка.

Проверьте возвращаемое значение и сообщите, если оно отличное от нуля:

if ((err = mysql_real_query(&mysql,"insert into scan (rfidnum) values ('2nd query')",
  (unsigned int)strlen("insert into scan (rfid) values ('2nd query')"))) != 0)
{
  // report err here, get additional information from these two API calls:
  errno = mysql_errno(&mysql);
  errmsg = mysql_error(&mysql);
}

Обновить: Если вы получили ненулевой результат, вам нужно проверить mysql_error(), чтобы узнать, какая ошибка. Поскольку вы сказали, что получаете сообщение об ошибке, если второй запрос - это SELECT, я бы предположил, что это CR_COMMANDS_OUT_OF_SYNC, что означает, что API считает, что есть некоторые ожидающие результаты (даже если результат состоит из нулевых строк). Вы не можете запустить следующий SQL-запрос, пока не закончите получение результатов SELECT (или вызов хранимой процедуры), даже если результат этого запроса пуст.

Вот краткое объяснение в документации MySQL: «Команды не синхронизированы»

Вам необходимо использовать mysql_free_result(), прежде чем вы сможете выполнить другой запрос. А это означает, что вам нужно использовать mysql_use_result(), прежде чем вы сможете его освободить.

Вот выдержка из документа mysql_use_result():

After invoking mysql_query() or mysql_real_query(), you must call mysql_store_result() or mysql_use_result() for every statement that successfully produces a result set (SELECT, SHOW, DESCRIBE, EXPLAIN, CHECK TABLE, and so forth). You must also call mysql_free_result() after you are done with the result set.

Хорошо, он вернул «1» для второго запроса. Какие файлы заголовков мне нужно включить для mysql_errno и mysql_error?

Steve 12.11.2008 01:37

Похоже, я получу код ошибки 1 для первого запроса вставки, если у меня есть второй запрос, который является оператором выбора

Steve 12.11.2008 01:50

Спасибо. Я только что попробовал: res = mysql_use_result (& mysql); mysql_free_result (res); но все равно безуспешно. Я просто продолжу работать над этим и сообщу вам, если найду решение. Спасибо

Steve 12.11.2008 03:56

Другие вопросы по теме