2011-12-17 50 views
1

我試着做功能來檢查表是否存在,並獲得總的行數,但我得到的結果1而不是99999.所以,我應該怎麼做才能正常工作?Mysql,檢查表和行數從C

int sql_table_length(char* database, char* dtable, char* mysql_user_name, char* mysql_password) 
{ 
    int retval = 0; 
    MYSQL *conn; 
    conn = mysql_init(NULL); 
    if (conn) 
    { 
     if (mysql_real_connect(conn, "localhost", mysql_user_name, mysql_password, database, 0, NULL, 0)!=0) 
     { 
      char chktable[512] = {0}; 
      sprintf(chktable,"%s%s%s", "SHOW TABLES LIKE '", dtable, "'"); 
      mysql_query(conn, chktable); 
      if (mysql_store_result(conn)) 
      { 
       MYSQL_RES *result; 
       char lngtable[512] = {0}; 
       sprintf(lngtable, "%s%s", "SELECT COUNT(*) FROM ", dtable); 
       if (!(mysql_query(conn, lngtable))) 
       { 
        result = mysql_store_result(conn); 
        retval = mysql_num_rows(result); // here I get 1 
        mysql_free_result(result); 
       } 
       else retval = -4; //no rows 
      } 
      else retval = -3;  //don't exist 
     } 
     else retval = -2;   //can't connect 
    } 
    else retval = -1;    //no connection 
    mysql_close(conn); 
    return retval; 
} 

謝謝!

回答

2

您的查詢,SELECT COUNT(*) FROM table返回一行,其中包含表中的行數。不要計算結果中的行數,而是要查詢返回的數字。

你會想這樣做(未經測試):

MYSQL_STMT *stmt; 
MYSQL_BIND bind; 
long rows; 
my_bool error; /* Omit at your own risk */ 

stmt = mysql_stmt_init(mysql) 
mysql_stmt_prepare(stmt, lngtable, strlen(lngtable)); 
mysql_stmt_execute(stmt); 

memset(&bind, 0, sizeof(bind)); 
bind.buffer_type = MYSQL_TYPE_LONG; 
bind.buffer = (char *)&rows; 
bind.error = &error; /* Omit at your own risk */ 

mysql_stmt_bind_result(stmt, &bind); 

mysql_stmt_fetch(stmt); 
printf("Number of rows: %ld\n", rows); 

您應該添加錯誤檢查所有mysql電話。有關綁定參數的更多示例,請參閱http://dev.mysql.com/doc/refman/5.0/en/mysql-stmt-fetch.html

或者,您可以將您的查詢更改爲SELECT * FROM table之類的內容,並保留其餘代碼,但這要求MySQL執行更多工作,並且結果可能需要更長時間。

+0

但我怎樣才能得到這個數字在retval?我可以用我的代碼得到它嗎?當然,我想要更快的解決方案。 – 2011-12-17 23:47:02

+0

我添加了一些示例代碼;你想把這些東西放在'sprintf(lngtable,...)'調用代替你的'mysql_query'調用之後。 – 2011-12-17 23:59:32

+0

WOW,如此複雜?我得到一些錯誤:/ home/name /桌面/ _c/_mySqlGUI/mySQLgui/my_main.c||在函數'sql_table_lng':| /home/name/Desktop/_c/_mySqlGUI/mysqlgui/my_main.c|716|error:'mysql_stmt_bind_result'的參數2的不兼容類型| /usr/include/mysql.h|690|note:期望'struct MYSQL_BIND *',但參數的類型爲'MYSQL_BIND'| /home/name/Desktop/_c/_mySqlGUI/mysqlgui/my_main.c|687|warning:未使用的變量'result'[-Wunused-variable] | || ===構建完成:2個錯誤,1個警告=== | – 2011-12-18 00:11:39

1

大衛的建議後,我發現更簡單和更安全的方式來獲得結果。也許有人會需要這個。

int sql_table_length(char* database, char* dtable, char* mysql_user_name, char* mysql_password) 
{ 
    MYSQL *conn; 
    MYSQL_RES *result; 
    MYSQL_ROW rowdata; 
    int retval = 0; 
    conn = mysql_init(NULL); 
    if (conn) 
    { 
     if (mysql_real_connect(conn, "localhost", mysql_user_name, mysql_password, database, 0, NULL, 0)!=0) 
     { 
      char chktable[512] = {0}; 
      sprintf(chktable,"%s%s%s", "SHOW TABLES LIKE '", dtable, "'"); 
      if (!(mysql_query(conn, chktable))) 
      { 
       result = mysql_store_result(conn); 
       if (mysql_num_rows(result)) 
       { 
        char lngtable[512] = {0}; 
        sprintf(lngtable, "%s%s", "SELECT COUNT(*) FROM ", dtable); 
        if (!(mysql_query(conn, lngtable))) 
        { 
         result = mysql_store_result(conn); 
         if (result) 
         { 
          rowdata = mysql_fetch_row(result); 
          if (rowdata) 
           retval = atoi(rowdata[0]); 
          else retval = -7; // data error 
         } 
         else retval = -6;  // result error 
         mysql_free_result(result); 
        } 
        else retval = -5;   // can't select 
       } 
       else retval = -4;    // table don't exist 
      } 
      else retval = -3;     // can't query 
     } 
     else retval = -2;      // can't connect 
    } 
    else retval = -1;       // no server connection 
    mysql_close(conn); 
    return retval; 
} 

對可能的內存泄漏(或其他)的任何評論是值得歡迎的!

+0

我需要,這很有幫助。謝謝。 – mmdemirbas 2012-09-07 09:21:20