2016-04-25 11 views
1

私は現在、ランナーを数えなければならないプロジェクトに取り組んでいます。ある時点で、ローカルデータベース(mysqlLocal)から私が働いている高等学校(mysqlLycee)にデータを転送する必要があります。MySQLを使用してCで2つのデータベースと対話する方法は?

私はこれを行うのが良いアイデアだと思っていますが、何らかの理由で私はプログラムを実行するときにsegfaultを持っています。

#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;

EDIT:mysqlのチェックを追加しましたが、プログラムを起動するときに、まだセグメンテーションフォールト。

+0

MySQLが呼び出すたびにエラーチェックを追加してください。 – fluter

+0

私はmysqlチェックを行うようにコードを修正しましたが、とにかく、私がプログラムを実行するとsegfaultが現れます。 –

+0

スペースと改行は安価です。それらを使用してください。 –

答えて

3

ローカルデータベースへの接続を閉じ、その後、その接続に関連付けられた結果セットから行をフェッチしようとします。それは動作しません。

あなたが他の1つのDBからのデータを転送する場合、あなたはどちらかでなければなりませんメモリに

  • 最初吸い込み1 DBからの全ての希望のデータ(すべての行をフェッチし、あなたが必要とする内容を保存しますOR

  • 両方のデータベースへの接続を同時にオープンします。

+0

ありがとうございました!私は両方の接続を保持しようとしたが、私もそれに問題があった。しかし、データを格納することは、実際に私が考えなかった解決策です! –

関連する問題