несколько mysql_real_query () в цикле while - PullRequest
3 голосов
/ 11 ноября 2008

Кажется, что когда у меня есть одна функция 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);
    }
}

Ответы [ 2 ]

1 голос
/ 12 ноября 2008

Всегда проверяйте возвращаемое значение вызова 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() doc:

После вызова mysql_query () или mysql_real_query (), вы должны вызвать mysql_store_result () или mysql_use_result () для каждого оператора который успешно дает результат установить (SELECT, SHOW, DESCRIBE, EXPLAIN, ПРОВЕРИТЬ ТАБЛИЦУ и т. Д.). Вы должны также вызвать mysql_free_result () после Вы закончили с набором результатов.

0 голосов
/ 11 ноября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...