2012-01-05 123 views
1

我已經多次閱讀文檔,我已經在谷歌搜索,我發現了很多的例子,下面的代碼是我的研究結果。 但現在我有一個大問題,我找不到解決方案來解決它。 下面的代碼執行查詢,但不顯示結果,它總是返回0行,而它必須返回2行...我不明白錯誤在哪裏。準備SELECT語句執行但總是返回0行

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <mysql/mysql.h> 

#define STRING_SIZE 50 

#define SELECT_SAMPLE "select p.id_paz from pazienti p where p.id_doc = ?" 

int main(void) 
{ 
    MYSQL *conn; 
    MYSQL_STMT *stmt; 
    MYSQL_BIND pbind[1],result[1]; /* results */ 
    unsigned long length; 
    int   row_count; 
    char   login[STRING_SIZE]; 
    my_bool  is_null; 

    unsigned long plength; 
    char *pdata; 
    my_bool  p_is_null; 

    // Open Database 
    const char *server = "localhost"; 
    char *user = "root"; 
    char *password = "password"; /* set me first */ 
    char *database = "ProgettoSi"; 
    conn = mysql_init(NULL); 
    /* Connect to database */ 
    if (!mysql_real_connect(conn, server, user, password, database, 0, NULL, 0)) { 
     //... 
    } 

    // Allocate statement handler 
    stmt = mysql_stmt_init(conn); 

    if (mysql_stmt_prepare(stmt, SELECT_SAMPLE, strlen(SELECT_SAMPLE))) 
    { 
     //... 
    } 
    fprintf(stdout, " prepare, SELECT successful\n"); 

    plength = STRING_SIZE * sizeof(char); 
    p_is_null = 0; 
    pdata = (char*)malloc(STRING_SIZE * sizeof(char)); 

    /* STRING PARAMETER */ 
    pbind[0].buffer_type= MYSQL_TYPE_STRING; 
    pbind[0].buffer= (char *)pdata; 
    pbind[0].buffer_length=STRING_SIZE * sizeof(char); 
    pbind[0].is_null= &p_is_null; 
    pbind[0].length= &plength; 

    if(mysql_stmt_bind_param(stmt, pbind)) { 
     //... 
    } 
    mysql_real_escape_string(conn, pdata, "123", strlen("123")*sizeof(char)); 
    plength = strlen(pdata) + 1; 

    printf("Executing query with parameters %s. \n", pdata); 
    /* Execute the SELECT query */ 
    if (mysql_stmt_execute(stmt)) 
    { 
     //... 
    } 

    /* Bind the result buffers for all 4 columns before fetching them */ 

    result[0].buffer_type= MYSQL_TYPE_STRING; 
    result[0].buffer= (char *)login; 
    result[0].buffer_length= STRING_SIZE; 
    result[0].is_null= &is_null; 
    result[0].length= &length; 

    if (mysql_stmt_bind_result(stmt, result)) 
    { 
     //... 
    } 

    if (mysql_stmt_store_result(stmt)) 
    { 
     //... 
    } 

    row_count= 0; 
    fprintf(stdout, "Fetching results ...\n"); 
    while (!mysql_stmt_fetch(stmt)) 
    { 
     row_count++; 
     fprintf(stdout, " row %d\n", row_count); 

     /* column 2 */ 
     fprintf(stdout, " column1 (string) : "); 
     if (is_null) 
      fprintf(stdout, " NULL\n"); 
     else 
      fprintf(stdout, " %s(%ld)\n", login, length); 
    } 

    /* Validate rows fetched */ 
    fprintf(stdout, " total rows fetched: %d\n", row_count); 
    /* Close the statement */ 
    if (mysql_stmt_close(stmt)) 
    { 
     //... 
    } 
    return 0; 
} 

它的工作原理,如果我手動插入查詢中的值。

#define SELECT_SAMPLE "select p.id_paz from pazienti p where p.id_doc = 123" 

如果我執行這個查詢,顯然更多的註釋代碼...它的工作原理...

+2

最好的錯誤條件愚蠢的問題:你* did *仔細檢查,數據庫實際上包含你期望的數據行?如果是的話,我會建議將示例代碼縮短到絕對最小值,以便仍然顯示觀察到的行爲。那裏有很多錯誤檢查,顯然沒有被觸發;他們沒有對這個例子做出貢獻,或者可以用簡單的'assert()'來代替,以表明你*做了*檢查條件... – DevSolar 2012-01-05 15:55:11

+0

是的,我做了仔細檢查。現在像你建議我簡短的例子代碼。 – 2012-01-05 16:23:10

回答

1

mysql_stmt_fetch有四個可能的返回值:0(成功),1(錯誤),MYSQL_NO_DATAMYSQL_DATA_TRUNCATED。你的循環終止於成功以外的任何事情 - 但你不檢查實際發生的事情。你可能有0行返回,或者你可能有最好的檢查通過mysql_stmt_errno()mysql_stmt_error() ...