1

1 秒ごとに関数コールバックがある C プログラムを実行しています。以下は、リストされているコードのスニペットです。

char timeBuf[10],secondBuf1[100],queryBuf1[500],queryBuf2[500];
char buff[20] = {0};
struct timeval tv;
gettimeofday (&tv, NULL);
tv.tv_sec -= 5;
strftime(buff, 20, "%Y-%m-%d %H:%M:%S", localtime(&tv.tv_sec));
printf("\nTime is %s", buff);

sprintf(secondBuf1,"INSERT INTO  secondsLog2 (secondLogID , timeStampID ) VALUES (NULL,'%s')",buff);
//printf("Query 1 before executing %s\n",queryBuf1);
if (mysql_query(localConn, secondBuf1)) 
{
    printf("Error in insert of seconds log %s\n",mysql_error(localConn));
    exit(1);
}

sprintf(queryBuf1,"SELECT ipDest, portDest, SUM(packetLen), COUNT(ipDest) FROM source1 WHERE timeStamp = '%s' GROUP BY portDest",buff);
printf("\nQuery buf %s",queryBuf1);
if(mysql_query(remoteConn, queryBuf1))
{
    printf("Error in first query of select %s\n",mysql_error(remoteConn));
    exit(1);
}
localRes1 = mysql_use_result(remoteConn);
while((localRow1 = mysql_fetch_row(localRes1)) !=NULL)
            {
              sprintf(queryBuf1,"INSERT INTO  export1 (iBTID ,timeStampID ,ipDest ,portDest,totalBits, packetCount) VALUES (NULL,'%s','%s','%s',%s,%s)",buff, localRow1[0],localRow1[1],localRow1[2],localRow1[3],localRow1[4]);
              printf("Query 1 before executing %s\n",queryBuf1);
              if (mysql_query(localConn, queryBuf1)) 
              {
                printf("Error in first query of insert %s\n",mysql_error(localConn));
                 exit(1);
              }

            }
                        mysql_free_result(localRes1);

このスクリプトを実行すると、次のエラーが表示されます。コマンドが同期されSELECTていません。現在、このコマンドを実行することはできません:

Time is 2012-07-17 00:59:14
Query buf SELECT ipDest, portDest, SUM(packetLen), COUNT(ipDest) FROM source1 WHERE timeStamp = '2012-07-17 00:59:14' GROUP BY portDest
Time is 2012-07-17 00:59:15
Query buf SELECT ipDest, portDest, SUM(packetLen), COUNT(ipDest) FROM source1 WHERE timeStamp = '2012-07-17 00:59:15' GROUP BY portDestError in first query of select Commands out of sync; you can't run this command now
4

1 に答える 1

3

結果を返すクエリの結果セットをクリアする必要があります。結果を使用していない場合は、次の電話番号に電話してください。

MYSQL_RES *results;
results = mysql_store_result(localConn);
mysql_free_result(results);

結果を使用するには、結果を返すクエリの後にmysql_store_result(または)を呼び出すだけで、後で必ずそれらを使用してください。これにより、エラーの問題が解決されます。mysql_use_resultmysql_free_resultCR_COMMANDS_OUT_OF_SYNC

mysql_store_resultのドキュメントから(強調が追加されました):

mysql_query()またはmysql_real_query()を呼び出した後、結果セット(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLEなど)を正常に生成するすべてのステートメントに対してmysql_store_result()またはmysql_use_result()を呼び出す必要があります。結果セットが完了したら、mysql_free_result()も呼び出す必要があります。

于 2012-07-16T17:24:43.013 に答える