IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

C / Sqlite3 : SQL error: (null), Segmentation fault (core dumped)


Sujet :

C

  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Par défaut C / Sqlite3 : SQL error: (null), Segmentation fault (core dumped)
    Bonjour,

    Je me suis lancé dans la création d'un programme en C avec sqlite3 pour la base de donnée.

    J'arrive à ouvrir la base de donnée à partir du C mais j'ai un problème lorsque je j'essaye d'insérer des donnée dans une table.

    Terminal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Opened database successfully
    SQL error: (null)
    Segmentation fault (core dumped)
     
     
    ------------------
    (program exited with code: 139)
    Press return to continue
    Après quelques test j'en ai conclu que l'erreur vient de cette partie du code (quand je la met en commentaire je n'ai pas d'erreur) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
     
    static int callback(void *NotUsed, int argc, char **argv, char **azColName)
    {
    	int i;
    	for(i=0; i<argc; i++){
    	printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    	}
    	printf("\n");
    	return 0;
    }
     
    ////////////  PARTIE QUI POSE PROBLEME SELON MOI ///////////////
    void SQLnewExercise(int Id,char *Name)
    {
    	sqlite3 *db;
    	char *zErrMsg = 0;
    	int rc;
    	char *sql;
     
    	/* Create SQL statement */
    	sql="INSERT INTO Exercises (Id,Name)"\
    		"VALUES (3, '%s');",Name;
     
    	/* Execute SQL statement */
    	rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
    	if( rc != SQLITE_OK ){
    		fprintf(stderr, "SQL error: %s\n", zErrMsg);
    		sqlite3_free(zErrMsg);
    	}
    	else{
    		fprintf(stdout, "Records created successfully\n");
    	}
    }
    /////////////////////     FIN DE LA PARTIE QUI POSE PROBLEME    ///////////////
     
    // MAIN
     
    int main()
    {
    	int tempInt;
    	char *tempChar;
     
    	tempInt=2;
    	tempChar="test";
     
    	openDb();
     
    	SQLnewExercise(tempInt,tempChar);// C'EST APPAREMMENT QUAND LE PROGRAMME APPELLE CETTE FONCTION QUE J'AI UN SOUCI
     
    	closeDb();
     
    	return 0;
    }
    Merci d'avance pour vos réponses.

  2. #2
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 869
    Par défaut
    Deja cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sql="INSERT INTO Exercises (Id,Name)"\
    		"VALUES (3, '%s');",Name;
    est invalide en C. Si tu veux faire ca, utilise sprintf ou snprintf. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char sql[250] = "";
     
    snprintf(sql, 249, "INSERT INTO Exercises (Id,Name) VALUES (3, \"%s\");", Name);
    Pour ce qui concerne les requetes de sqlite3 (si elle ne fonctionne toujours pas apres cette modification).

  3. #3
    Membre éclairé
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Par défaut
    Votre code fonctionne bien uniquement si je met tout mon code dans la fonction main. Dès que je veux structurer mon code en fonctions, j'ai cette erreur :

    Segmentation fault (core dumped)


    Voici le morceau de code qui pose problème selon moi. Après avoir essayer un tas de choses, je ne sais plus vers quelle piste me diriger.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
     
    ////////////  PARTIE QUI POSE PROBLEME SELON MOI ///////////////
    void SQLnewExercise(int Id,char *Name)
    {
    	sqlite3 *db;
    	char *zErrMsg = 0;
    	int rc;
    	char sql[250] = "";
     
    	/* Create SQL statement */
    	   snprintf(sql, 249,"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (6,\"%s\" , 25, 'Rich-Mond ', 65000.00 );",Name);
     
     
    	/* Execute SQL statement */
    	rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
    	if( rc != SQLITE_OK ){
    		fprintf(stderr, "SQL error: %s\n", zErrMsg);
    		sqlite3_free(zErrMsg);
    	}
    	else{
    		fprintf(stdout, "Records created successfully\n");
    	}
    }
    /////////////////////     FIN DE LA PARTIE QUI POSE PROBLEME    ///////////////
     
    // MAIN
     
    int main()
    {
    	int tempInt;
    	char *tempChar;
     
    	tempInt=2;
    	tempChar="test";
     
    	openDb();
     
    	SQLnewExercise(tempInt,tempChar);// C'EST APPAREMMENT QUAND LE PROGRAMME APPELLE CETTE FONCTION QUE J'AI UN SOUCI
     
    	closeDb();
     
    	return 0;
    }

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je ne vois aucune initialisation du pointeur sqlite3 *db;.

  5. #5
    Membre éclairé
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Bonjour,

    Je ne vois aucune initialisation du pointeur sqlite3 *db;.
    Bonjour, si je ne dis pas de bêtises *db envoi vers le nom de ma base de donnée après avoir utilisé cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void openDb()
    {
    	sqlite3 *db=NULL;
    	//char *zErrMsg = 0;
    	int rc;
     
    	/* Open database */
    	rc = sqlite3_open("test.db", &db);
    	if(rc){
    		fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    		exit(0);
    	}
    	else{
    		fprintf(stderr, "Opened database successfully\n");
    	}
    }

  6. #6
    Invité
    Invité(e)
    Par défaut
    Sauf que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void openDb()
    {
        sqlite3 *db=NULL;
        rc = sqlite3_open("test.db", &db);
     
        ...
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void SQLnewExercise(int Id,char *Name)
    {
    	sqlite3 *db;
    Sont deux variables distinctes qui n'ont rien à voir entre elles, hormis leur nom.

  7. #7
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Citation Envoyé par imperio Voir le message
    Deja cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sql="INSERT INTO Exercises (Id,Name)"\
            "VALUES (3, '%s');",Name;
    est invalide en C. Si tu veux faire ca, utilise sprintf ou snprintf. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char sql[250] = "";
     
    snprintf(sql, 249, "INSERT INTO Exercises (Id,Name) VALUES (3, \"%s\");", Name);
    Pour ce qui concerne les requetes de sqlite3 (si elle ne fonctionne toujours pas apres cette modification), regarde l'exemple sur cette page.
    Attention aux injections SQL. sqlite n'a pas des requêtes préparées ?

  8. #8
    Membre éclairé
    Inscrit en
    Juillet 2009
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 272
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Sauf que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void openDb()
    {
        sqlite3 *db=NULL;
        rc = sqlite3_open("test.db", &db);
     
        ...
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void SQLnewExercise(int Id,char *Name)
    {
    	sqlite3 *db;
    Sont deux variables distinctes qui n'ont rien à voir entre elles, hormis leur nom.
    Exact. C'était bien la source de mon problème.

    J'ai donc initialisé le pointeur à NULL dans ma fonction open.
    Et j'ai rajouté un paramètre "db" dans ma fonction "SQLnewExercise".

    Tout fonctionne à présent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    void SQLnewExercise(int Id,char *Name,sqlite3 *db) //ajout de "sqlite3 *db" dans les paramètres
    {
    	//sqlite3 *db; // plus besoin de cette variable ici du coup
    	char *zErrMsg = 0;
    	int rc;
    	char sql[250] = "";
     
    	/* Create SQL statement */
    	   snprintf(sql, 249,"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (6,\"%s\" , 25, 'Rich-Mond ', 65000.00 );",Name);
     
     
    	/* Execute SQL statement */
    	rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
    	if( rc != SQLITE_OK ){
    		fprintf(stderr, "SQL error: %s\n", zErrMsg);
    		sqlite3_free(zErrMsg);
    	}
    	else{
    		fprintf(stdout, "Records created successfully\n");
    	}
    }
     
    // MAIN
     
    int main()
    {
            sqlite3 *db=NULL;
    	char *zErrMsg = 0;
    	int rc;
     
    	/* Open database */
    	rc = sqlite3_open("test.db", &db);//db prend la valeur "test.db"
    	if(rc){
    		fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    		exit(0);
    	}
    	else{
    		fprintf(stderr, "Opened database successfully\n");
    	}
     
     
    	int tempInt;
    	char *tempChar;
     
    	tempInt=2;
    	tempChar="test";
     
    	SQLnewExercise(tempInt,tempChar,db);//on rajoute un paramètre db qui a en mémoire la bonne valeur
     
    	closeDb();
     
    	return 0;
    }
    Pour les questions de sécurité il n'y a aucun souci. C'est une petite application pour un usage personnelle. Et les informations ne sont absolument pas confidentielles.

    Merci à tous pour votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. segmentation fault (core dumped)
    Par domdom974 dans le forum Fortran
    Réponses: 2
    Dernier message: 04/08/2009, 09h07
  2. [ASE 15.0.3] Segmentation Fault - core dumped
    Par dngaya dans le forum Adaptive Server Enterprise
    Réponses: 0
    Dernier message: 04/06/2009, 10h55
  3. segmentation fault (core dumped)
    Par miamiam dans le forum Débuter
    Réponses: 3
    Dernier message: 26/11/2008, 11h46
  4. Réponses: 1
    Dernier message: 10/12/2006, 21h37
  5. Segmentation fault (core dumped)
    Par Battosaiii dans le forum C
    Réponses: 13
    Dernier message: 25/11/2005, 18h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo