首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >时间循环中的多个mysql_real_query()

问时间循环中的多个mysql_real_query()
EN

Stack Overflow用户
提问于 2008-11-11 09:26:59
回答 2查看 3.6K关注 0票数 3

似乎当我在一个连续will循环中有一个mysql_real_query()函数时,查询将被执行OK。

但是,如果while循环中有多个mysql_real_query(),则一个接一个。根据查询的不同,有时第一个查询和第二个查询都不会正确执行。

对我来说,这似乎是一个线程问题。我想知道mysql c api是否有处理这种问题的方法?有人知道怎么处理这事吗?mysql_free_result()无法工作,因为我甚至没有存储结果。

代码语言:javascript
复制
//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);
    }
}
EN

回答 2

Stack Overflow用户

发布于 2008-11-11 22:07:33

始终检查API调用的返回值。

mysql_real_query()返回一个整数。如果调用有效,则值为零,如果有错误,则为非零。

如果返回值为非零,请检查返回值并报告:

代码语言:javascript
复制
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()。

票数 1
EN

Stack Overflow用户

发布于 2008-11-11 09:46:16

好的,为了测试目的,将tagBuffer变量从第一个mysql_real_query调用中取出,并用常量替换它,就像第二个测试查询一样。

此时,您只需重复插入两个常量字符串。真正的应该能工作。

如果这确实有效,那么我们必须找出tagBuffer的问题所在。它是否收到了一些不寻常的字符,这些字符在某种程度上混淆了MySQL,但在单个查询情况下却没有被发现?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/280421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档