3

私は理解できないCでこの奇妙な振る舞いをしています。私はCにかなり慣れていないので、おそらく私です。私が達成しようとしているのは、MySQLクエリを実行して結果を返す関数を作成することです。奇妙なことに、以下のコードでは、接続を閉じて結果を解放すると(順序が予想されるように)、「retvalue」に格納した値がなくなったように見えます。結果を解放して接続を閉じる前にreturnを設定すると、値が返されますが、明らかに接続は閉じられておらず、MySQLは最終的に「接続が多すぎます」というエラーを表示します。

int CheckBox(char *mac)
{
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;

/* database details */
char *server = "localhost";
char *user = "user";
char *password = "pw";
char *database = "db";
int retvalue;

conn = mysql_init(NULL);

/* connect to database */
if (!mysql_real_connect(conn, server,user, password, database, 0, NULL, 0))
{
    fprintf(stderr, "%s\n", mysql_error(conn));
    exit(1);
}

/* create and send SQL query */
char query[1600];
sprintf(query,"SELECT * FROM boxes WHERE mac = '%s'", mac);
if (mysql_query(conn, query))
{
    fprintf(stderr, "%s\n", mysql_error(conn));
    exit(1);
}

res = mysql_use_result(conn);
/* check result to see if we have a hit */
if ((row = mysql_fetch_row(res)) != NULL)
{

    printf("mac (%s) did exist with id %s.\n",mac,(char *)row[0]);
    retvalue = (int)row[0];
} else
{
    printf("mac (%s) did NOT exist ",mac);
    /* mac address did not yet exist, so create it */
    sprintf(query,"INSERT INTO boxes (mac) VALUES ('%s')",mac);
    if (mysql_query(conn, query))
    {
        fprintf(stderr, "%s\n", mysql_error(conn));
        exit(1);
    } else
    {
        printf("but now does\n");
        CheckBox(mac);
    }
}

/* close connection */
mysql_free_result(res);
mysql_close(conn);

/* return id number of box */
return retvalue;
}

したがって、質問は次のとおりです。最初に結果を解放して接続を閉じることが正しい順序であると想定するのは正しいですか?このような関数を実行すると、retvalueに割り当てた値が失われるのはなぜですか?

初心者に親切にしてくれてありがとう:-)

4

1 に答える 1

4

キャストretvalue = (int)row[0]が間違っています。結果のアドレス(intに変換)を。に入れretvalueます。row[0]char*、なので、を使用する必要がありますretvalue=atoi(row[0])

于 2012-05-07T19:59:50.017 に答える