while循环中有多个mysql_real_query()

时间:2008-11-11 09:26:59

标签: mysql

似乎当我在一个连续的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);
    }
}

2 个答案:

答案 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但是在单一查询案例中没有发现它?