似乎当我在一个连续的while循环中有一个mysql_real_query()函数时,查询将被执行OK。
但是,如果多个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);
}
}
答案 0 :(得分:1)
始终检查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认为有一些结果待定(即使结果由零行组成)。在完成获取SELECT
(或调用存储过程)的结果之前,您无法启动下一个SQL查询,即使该查询的结果为空。
以下是MySQL文档中的简要说明:“Commands out of sync”
在运行其他查询之前,您需要使用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() 你完成了结果集。
答案 1 :(得分:0)
好的,出于测试目的,请从第一个tagBuffer
调用中取出mysql_real_query
变量,并将其替换为常量,就像您的第二个测试查询一样。
此时你只需要重复插入两个常量字符串。 真的应该有用。
如果确实有效,那么我们必须找出tagBuffer
的错误。它是否会收到不寻常的字符,以某种方式混淆MySQL但是在单一查询案例中没有发现它?