2016-04-25 54 views
1

我目前正在研究一個項目,我必須計算跑步者人數。在某些時候,我必須將數據從本地數據庫(mysqlLocal)傳輸到我正在工作的高中(mysqlLycee)。如何在C中使用MySQL與2個數據庫進行交互?

我認爲這樣做是個好主意,但由於某種原因,我在執行程序時遇到了段錯誤。

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/socket.h> 
#include <arpa/inet.h> 
#include <netdb.h> 
#include <netinet/in.h> 
#include <unistd.h> 
#include <string.h> 
#include <mysql.h> 


int main(int argc, char *argv[]){ 
    MYSQL mysqlLocal; 
    MYSQL_RES *result = NULL; 
    MYSQL_ROW row; 
    char requete[150]; 
    int num_champs; 
    char noParticipant[5]; 
    char kmParcourus[3]; 
    mysql_init(&mysqlLocal); 
    if(!mysql_real_connect(&mysqlLocal,"127.0.0.1","root","debianCCF","localCCF",0,NULL,0))printf("Error on first connect"); 

    sprintf(requete,"SELECT NO_PARTICIPANT, KMPARCOURUS FROM PARTICIPANTS WHERE NO_COURSE = %s",argv[5]); 
    if(!mysql_query(&mysqlLocal,requete))printf("Error on first query"); 
    result = mysql_use_result(&mysqlLocal); 
    num_champs=mysql_num_fields(result); 
    mysql_close(&mysqlLocal); 

    MYSQL mysqlLycee; 
    mysql_init(&mysqlLycee); 
    if(!mysql_real_connect(&mysqlLycee,argv[1],argv[2],argv[3],argv[4],0,NULL,0))printf("Error on second connect"); 
    int i; 
    while ((row = mysql_fetch_row(result))){ 
     unsigned long *lengths;  
     lengths = mysql_fetch_lengths(result); 
     for(i=0;i<num_champs;i++){ 
      if(i==0)sprintf(noParticipant,"%.*s", (int) lengths[i], row[i] ? row[i] : "NULL"); 
      if(i==1)sprintf(kmParcourus,"%.*s", (int) lengths[i], row[i] ? row[i] : "NULL"); 
     } 
     sprintf(requete,"UPDATE PARTICIPANTS SET KMPARCOURUS=%s WHERE NO_PARTICIPANT=%s",kmParcourus,noParticipant); 
     if(!mysql_query(&mysqlLycee,requete))printf("Error on second query"); 

    } 
    mysql_free_result(result); 
    mysql_close(&mysqlLycee); 
    return 0; 
} 

我工作的Debian 8,然後用下面的命令編譯:

gcc updateLycee.c -o updateLycee -lmysqlclient -L/usr/lib64/mysql -I/usr/include/mysql;

編輯:添加MySQL的檢查,但在啓動程序時仍出現段錯誤。

+0

請爲每個MySQL調用添加錯誤檢查。 – fluter

+0

我修改了代碼來讓mysql檢查,但無論如何,當我執行segfault出現的程序時。 –

+0

空格和換行符便宜;使用它們。 –

回答

3

您關閉與本地數據庫的連接,然後嘗試從與該連接關聯的結果集中獲取行。這是行不通的。

如果你想將數據從一個數據庫轉移到其他然後您必須

  • 第一啜食所有想要從一個DB數據到內存(讀取所有行和存儲你所需要的內容例如普通陣列),或者

  • 保持與兩個數據庫同時打開的連接。

+0

謝謝你的幫助!我試着保持這兩種聯繫,但我也遇到了麻煩。但是,存儲數據實際上是我沒有考慮的解決方案! –

相關問題