似乎当我在一个连续will循环中有一个mysql_real_query()函数时,查询将被执行OK。
但是,如果while循环中有多个mysql_real_query(),则一个接一个。根据查询的不同,有时第一个查询和第二个查询都不会正确执行。
对我来说,这似乎是一个线程问题。我想知道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);
}
}发布于 2008-11-11 22:07:33
始终检查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);
}update: --如果得到非零的结果,需要检查mysql_error()以找出哪个错误。因为您说如果第二个查询是SELECT,您会得到一个错误,我猜是CR_COMMANDS_OUT_OF_SYNC,这意味着API认为有一些结果挂起(即使结果包含零行)。在获取SELECT的结果(或调用存储过程)之前,您无法启动下一个SQL查询,即使该查询的结果是空的。
下面是MySQL文档中的一个简短解释:"不同步的命令“
在运行另一个查询之前,您需要使用mysql_free_result()。这意味着您需要使用mysql_use_result()才能释放它。
以下是mysql_use_result()文档的摘录:
在调用mysql_query()或mysql_real_query()之后,必须对每个成功生成结果集的语句(选择、显示、描述、解释、检查表等)调用mysql_store_result()或mysql_use_result()。在处理完结果集之后,还必须调用mysql_free_result()。
发布于 2008-11-11 09:46:16
好的,为了测试目的,将tagBuffer变量从第一个mysql_real_query调用中取出,并用常量替换它,就像第二个测试查询一样。
此时,您只需重复插入两个常量字符串。真正的应该能工作。
如果这确实有效,那么我们必须找出tagBuffer的问题所在。它是否收到了一些不寻常的字符,这些字符在某种程度上混淆了MySQL,但在单个查询情况下却没有被发现?
https://stackoverflow.com/questions/280421
复制相似问题