Кажется, что когда у меня есть одна функция 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);
}
}
Да, я пробовал как вставить, так и выбрать. Если это выбор, кажется, что из первого запроса ничего не вставляется. Если это вставка, будет вставлен только один кортеж.
mysql_free_res следует использовать только в результате запроса, который производит данные строки. "вставки" этого не делают.






Хорошо, в тестовых целях возьмите свою переменную tagBuffer из первого вызова mysql_real_query и замените ее константой, как ваш второй тестовый запрос.
В этот момент вы просто будете многократно вставлять две постоянные строки. Этот В самом деле должен работать.
Если это сработает, то мы должны выяснить, что не так с tagBuffer. Может ли он получать необычные символы, которые каким-то образом сбивают с толку MySQL, но не были обнаружены в одном случае запроса?
Я только что попробовал ваше предложение. К сожалению, с tagBuffer я получил тот же результат, что и при вставке константы. Единственная разница в том, что теперь моя «1-я» константа не появляется снова, когда я добавляю второй запрос.
Хорошо, затем перейдите к ответу Билла и проверьте коды ошибок MySQL.
Всегда проверяйте возвращаемое значение вызова 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?
Похоже, я получу код ошибки 1 для первого запроса вставки, если у меня есть второй запрос, который является оператором выбора
Спасибо. Я только что попробовал: res = mysql_use_result (& mysql); mysql_free_result (res); но все равно безуспешно. Я просто продолжу работать над этим и сообщу вам, если найду решение. Спасибо
ваш второй запрос действительно еще одна вставка?