[MySQL/C] Commands out of sync

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Bij het uitvoeren van meerdere queries gaat altijd de eerste query goed, alle opvolgende queries lopen fout met de melding: Commands out of sync; You can't run this command now

Ik ruim netjes de resultset op na gebruik en kijk zelf of er nog extra sets zijn die moeten worden opgeruimd (zoals in php eigenlijk altijd moet). Een voorbeeld waar deze fout optreedt:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void    db_request_group(MYSQL *conn, struct nn_group *group)
{
        MYSQL_RES       *db_result;
        MYSQL_ROW       db_row;
        char            *query;

        query   =       malloc(strlen(group->group_name) + 27);
        sprintf(query, "CALL nn_request_group('%s')", group->group_name);

        if (mysql_real_query(conn, query, strlen(query)))
        {
                printf("Error during query execution!\nQuery: %s\nError: %s\n", query, mysql_error(conn));
                exit(1);
        }

        db_result               =       mysql_use_result(conn);
        db_row                  =       mysql_fetch_row(db_result);
        group->database_id      =       atoi(db_row[0]);
        group->old_mark         =       atoi(db_row[1]) > 0 ? atoi(db_row[1]) : group->old_mark;

        mysql_free_result(db_result);
        free(query);

        // mysql adds extra, empty resultsets after each sproc
        // preventing further queries, so we clear this first
        while (db_result = mysql_use_result(conn))
                mysql_free_result(db_result);
}


Iemand enig idee waarom ik altijd maar één query kan uitvoeren? De verbinding met de database is netjes gemaakt met de CLIENT_MULTI_RESULTS flag (en anders zou de eerste query ook niet moeten worden uitgevoerd).

Ik ontken het bestaan van IE.


Acties:
  • 0 Henk 'm!

  • Cascade
  • Registratie: Augustus 2006
  • Laatst online: 16-09 11:44
Waarschijnlijk dit:
When using mysql_use_result(), you must execute mysql_fetch_row() until a NULL value is returned, otherwise, the unfetched rows are returned as part of the result set for your next query. The C API gives the error Commands out of sync; you can't run this command now if you forget to do this!
Wat op zich raar is van de API aangezien je verwacht dat mysql_free_result dat soort dingen ook opruimt.

Acties:
  • 0 Henk 'm!

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Hmm, dat blijkt het probleem niet te zijn. Mijn procedure geeft sowieso altijd maar één rij terug.

Het probleem blijkt te zitten in het feit dat MySQL bij het aanroepen van een sproc een call naar mysql_use_next() vereist.

Ik ontken het bestaan van IE.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 00:02
cyberstalker schreef op zaterdag 11 juli 2009 @ 15:37:
Hmm, dat blijkt het probleem niet te zijn. Mijn procedure geeft sowieso altijd maar één rij terug.
So? Dan moet je alsnog één keer mysql_fetch_row() aanroepen om een NULL waarde terug te krijgen. Dat moet dus zowel in je query (voor regel 21) als in het lusje later (voor regel 27).

Ik denk dus dat Cascade gewoon gelijk heeft en je huidige code zich niet aan de API houdt; dan krijg je dit soort fouten. ;)