Sqlite erreur a l'execution ? (c++)

hello

on va déjà donner les information essentiel

sa compile:

$ make
c++ -lsqlite3 -Wall -Wextra -pedantic -D_FILE_OFFSET_BITS=64   -c -o main.o main.cpp
c++ main.o -o main -lsqlite3 -Wall -Wextra -pedantic -D_FILE_OFFSET_BITS=64

la base de donnée contiens des champ int et de type texte.

mai la lecture d’un champ de type text qui est vide (null?) fait planter le programe a l’execution:

terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_S_construct NULL not valid

bon j’ai ajouter un fichier. car le code est pas colorer et on vois rien ici (déjà que code comme un …)
Je trouve pas comment on teste si la valeur est null dans un champs texte (syntaxe ?)
:blush: :005 (la doc sur le site de sqlite sa aide pas vraiment il faut dire…)

Merci d’avance
bd_sqlite.tar (40 KB)

Sinon, pour ton code lui-même… Ça serait pas mieux de faire une classe autour des fonctions SQLite, plutôt que des variables globales et des fonctions libres ? :mrgreen:

Sinon, pour ton code lui-même… Ça serait pas mieux de faire une classe autour des fonctions SQLite, plutôt que des variables globales et des fonctions libres ? :mrgreen:[/quote]
Merci pour ta réponse.
Pour les classe oui, mai pas dans l’imédia,histoire de comprendre un peux la lib sqlite pour des opération de base. la c est un code simple.
les classe demande quand même un peux de réflexion si on veux pouvoir les réutiliser plus tard,donc il faut savoir comment y placer les donnée ,héritage,héritage multiple etc:) (enfin d’après le livre que j’ai )

merci pour le texte ,reste a mettre en application :006
p.s t’a trouver sur une page lien ?

[quote=“panthere”]Pour les classe oui, mai pas dans l’imédia,histoire de comprendre un peux la lib sqlite pour des opération de base. la c est un code simple.
les classe demande quand même un peux de réflexion si on veux pouvoir les réutiliser plus tard,donc il faut savoir comment y placer les donnée ,héritage,héritage multiple etc:) (enfin d’après le livre que j’ai )[/quote]
D’expérience, il suffit de 3 classes pour couvrir quasiment tous les cas d’utilisation :

  • une qui englobe les fonctions directement liées à la base de données
  • une qui gère les requêtes (exécution SQL, paramètres et résultats)
  • une troisième spécialisée pour la gestion des transactions (nécessaire pour que le RAII permette de faire un rollback automatique si on sort du scope sans demander explicitement un commit, par exemple en cas d’exception)

J’ai juste été voir sur la page d’index de l’API C, histoire de me rafraîchir la mémoire. :mrgreen: sqlite.org/c3ref/funclist.html

Merci pour ta réponse :slightly_smiling:
Pou les class, je m’y suis mis.

pourquoi en faire 3 :108 une seul pourrait suffire
les fonction , open,setData,searchX,update,close son public
les requette son en static dans la partie privée ?

#ifndef DEF_STAT
#define DEF_STAT
#include <iostream>
#include <string>
#include <sstream>
#include <sqlite3.h>
class cSql {
	public:
	cSql ();

	bool setOpenDatabase(const std::string &)	;
	bool setCreatAllTable ()					;

	private:
	int _DataBaseHandle					;
// 7 table  relier par une clé mere
	static std::string _RqTCreatePrincipal		;
	static std::string _RqTCreateDroit			;
	static std::string _RqTCreateMd5			;
	static std::string _RqTCreateUser			;
	static std::string _RqTCreateDate			;
	static std::string _RqTCreateSoftware		;
	static std::string _RqTCreateSave			;

	
};
#endif 

Je te parle de classes pour encapsuler en C++ (presque tout) l’ensemble de l’API SQLite, de manière à ce que ça soit réutilisable. Ta classe telle que tu l’envisages sera totalement inutile dans un autre projet. :wink:

Note : après recherche, il semblerait que 2 wrappers avec un design à peu près correct (à vue de nez) soient apparus depuis la dernière fois que j’ai cherché (ce qui remonte à plusieurs années… :mrgreen:) :

code.google.com/p/sqlite3pp/wiki/UsagePage (seul souci : il dépend de boost, ce qui n’est pas toujours souhaitable)
wanderinghorse.net/computing/sqlite/
Mais je ne sais pas du tout ce qu’ils valent en pratique.

C’est quand même dingue qu’il y ait aussi peu de bons wrappers C++ pour SQLite depuis le temps. Je sais bien que c’est pas bien compliqué à faire soi-même, mais quand même… :119

Je te parle de classes pour encapsuler en C++ (presque tout) l’ensemble de l’API SQLite, de manière à ce que ça soit réutilisable. Ta classe telle que tu l’envisages sera totalement inutile dans un autre projet. :wink:

Note : après recherche, il semblerait que 2 wrappers avec un design à peu près correct (à vue de nez) soient apparus depuis la dernière fois que j’ai cherché (ce qui remonte à plusieurs années… :mrgreen:) :

code.google.com/p/sqlite3pp/wiki/UsagePage (seul souci : il dépend de boost, ce qui n’est pas toujours souhaitable)
wanderinghorse.net/computing/sqlite/
Mais je ne sais pas du tout ce qu’ils valent en pratique.

C’est quand même dingue qu’il y ait aussi peu de bons wrappers C++ pour SQLite depuis le temps. Je sais bien que c’est pas bien compliqué à faire soi-même, mais quand même… :119[/quote]

effectivement ma classe ne sera pas ré-utilisable dans un autre projet mai d’un autre coter faire un wrapper me prendrai trop de temps :unamused: (et en plus sa ne sera pas du code propre… car fait par un débutant… :pray: ) mai c est vrai que c est domage car la classe perd un peux de son utiliter qui est de pouvoir ré-utiliser du code plus tard

pas boost est trop lourde pour c eque je veux faire et cette libraire a parfois des incompatibilité entre chaque version du coup ton projet peux avoir des souci de maintenance … bref pas utile .

Essaye le deuxième lien, il ne dépend pas de boost et propose deux APIs : une qui renvoie des codes d’erreur et l’autre qui lance des exceptions, ça te laisse le choix.
Et comme ça tu utiliseras un truc plus propre que l’API C de SQLite.