Bonjour à tous,
Je cherche actuelement à écrire des valeurs et des chaines de caractère dans une base de donnée, à partir d'un programme en C. Pour information, je travail sur Linux.
Merci d'avance pour votre aide.
Version imprimable
Bonjour à tous,
Je cherche actuelement à écrire des valeurs et des chaines de caractère dans une base de donnée, à partir d'un programme en C. Pour information, je travail sur Linux.
Merci d'avance pour votre aide.
Bonjour,
Doit on deviner avec quelle base de donnée tu travailles ?
J'utilise MySQL
Par contre, j'ai vu qu'il existé des solution avec oracle ou autre, mais je prefere un freeware ou une autre méthode ^^
Salut,
Il existe des bibliothèques pour s'interfacer avec MySQL dans tous les langages.
En C, par exemple:
http://dev.mysql.com/doc/refman/5.0/en/c.html
A+.
Oui je suis en train de lire ^^. Je cherche l'install de la librari pour pouvoir utiliser :
#include <my_global.h>
#include <mysql.h>
Sur linux bien sur ^p^
C'est bon je les ai trouvé, je vais me pencher sur les fonctions maintenant ^^. Au passage ma distrib c'est Ubuntu ( 8-) ).
Si vous avez des exemple tout fait, qui permettent de juste selectionné une table, l'ouvrir et écrire dans un champs, je vous en serais très reconnaissant.
Merci !!!!
Voila un exemple mais c'est sous windows. A toi d'adapter a Linux :
La connection à la base :
L'ajout de valeurs :Code:
1
2
3
4
5
6
7
8
9
10 MYSQL * connection(){ MYSQL * mysql ; mysql = mysql_init(NULL) ; if(!mysql_real_connect(mysql,"localhost","root","root","tabase",0,NULL,0)){ printf("Erreur dans la connection de la base : %s\n",mysql_error(mysql)) ; }else{ printf("Vous etes connecte a la base de donnees ......\n\n\n\n") ; } return mysql ; }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 printf("Vous allez ajouter un client dans la base\n"); printf("Entrer le numéro de client : "); num = saisirEntier() ; printf("Entrer le nom du client : "); scanf("%s",&nom); printf("Entrer le prenom du client : "); scanf("%s",&prenom); printf("Entrer le numero de rue : "); scanf("%d",&numrue); printf("Entrer le nom de la rue : "); scanf("%s",&nomrue); printf("Entrer le code postal : "); scanf("%d",&code); printf("Entrer la ville : "); scanf("%s",&ville); sprintf(requete,"insert into client values('%d','%s','%s','%d','%s','%d','%s');",num, nom, prenom, numrue, nomrue, code, ville); mysql_real_query(mysql,requete,(unsigned int) strlen(requete)); printf("\n"); printf("CLIENT AJOUTE ..........."); printf("\n"); printf("Voulez vous retourner au menu (0/1)?"); scanf("%d",&retour); break;
Merci, je vais essayer et je pense avoir compris, merci !!!
Au fait, ici le nom de ta table, c'est bien "client" ? (pour ton exemple d'écriture, pas de connection).
Et aussi en quoi est déclaré ton "requete" ??
Oui le nom de ma table est bien client :
Les différentes insertion correspondent au nom des différents champs.Code:sprintf(requete,"insert into client values('%d','%s','%s','%d','%s','%d','%s');",num, nom, prenom, numrue, nomrue, code, ville);
Et je déclare requete en quoi ?
char* ???
Mon "requete" est enmais je pense que tu peux le déclarer enCode:char requete[255]
sans soucis.Code:char *
C la même chose ^^.
Par contre j'ai compiler, j'arrive à me connecter, mais j'ai ce message d'avertissement lors de la compilation:
attention : incompatible implicit declaration of built-in function «strlen»
et bien sur, lorsque je lance le prog, je peux rentrer les valeurs des différentes variable de ma table, mais elle ne s'écrivent pas , voilà mon code :
Dans ma base, j'ai bien évidement les 9 variables (date, index, phase,....) écrit tel quel. Le prog me return "Problème d'interrogation". Donc cela n'écrit pas.Code:
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 #include <my_global.h> #include <mysql.h> #include <stdio.h> #include <stdlib.h> MYSQL *conn; int main(int argc, char**args) { MYSQL *con; MYSQL_RES *res; MYSQL_ROW row; unsigned int nb; unsigned long *lengths; unsigned int i; char index[100],date[100],phase[100],t_dessous[100],t_dedans[100],t_dessus[100],hygro[100],ventilation[100],rotation[100],resistance_1[100],resistance2[100],resistance3[100],resistance4[100],niveau[100],ev_remplissage[100],ev_vidange[100],requete[2000]; conn = mysql_init(NULL); if (conn==NULL) { printf ("\aErreur d'initiation du client !\n"); exit(EXIT_FAILURE); } con = mysql_real_connect(conn, "localhost", "root", "azerty", "malterie", 3306, NULL,0); if (con==NULL) { printf ("\aErreur de connection du client !\n"); exit(EXIT_FAILURE); } else { printf ("Connection établi !\nWelcome !\n"); printf("Vous allez ajouter des données dans la base\n"); printf("Entrer le numéro de l'index : \r\n"); scanf("%s",&index); printf("Entrer la date (xx.xx.xxxx) : \r\n"); scanf("%s",&date); printf("Entrer la phase en cour : \r\n"); scanf("%s",&phase); printf("Entrer la temperature de dessous : \r\n"); scanf("%s",&t_dessous); printf("Entrer la temperature de dedans : \r\n"); scanf("%s",&t_dedans); printf("Entrer la temperature de dessus : \r\n"); scanf("%s",&t_dessus); printf("Entrer l'état du moteur (on , off) : \r\n"); scanf("%s",&rotation); printf("Entrer le niveau d'eau (haut , bas) : \r\n"); scanf("%s",&niveau); printf("Entrer l'état de l'électrovanne de remplissage (on , off) : \r\n"); scanf("%s",&ev_remplissage); sprintf(requete,"insert into client values('%s','%s','%s','%s','%s','%s','%s','%s','%s');",index, date, phase, t_dessous, t_dedans, t_dessus, rotation, niveau, ev_remplissage); if(mysql_real_query(conn,requete,(unsigned int) strlen(requete))==0) { printf("Données ajoutées correctement dans la base !! ^^ =p xD >< :) ;) !p ( . )( . ) \r\n"); mysql_close(conn); printf("Fermeture du client. Bye !\r\n"); return 0; } else { printf ("\aProblème d'interrogation !\n"); mysql_close(conn); printf("Fermeture du client. Bye !\n"); return 0; } } }
Si quelqu'un voit l'erreur ... Merci ^^
C'est bon, j'ai remplacé, mais cela ne fonctionne toujours pas....
Ma base de donnée s'apelle malterie, et ma table "maltage", il faut bien que j'écrive ceci ? :
sprintf(requete,"insert into maltage values('%s','%s','%s','%s','%s','%s','%s','%s','%s');",index, date, phase, t_dessous, t_dedans, t_dessus, rotation, niveau, ev_remplissage);
Dans ma base, j'ai déclaré les champs en type VAR(100). je ne comprend pas pourquoi cela ne marche pas....
Je suis quasiment sur que le problème est à ce niveau :
Si quelqu'un peut me sortir du pétrin ^^ MerciCode:if(mysql_real_query(conn,requete,(unsigned int) strlen(requete))==0)
Essaye en enlevant ==0
Nb : Arrete de mettre 50 messages edit plutot ^^Code:if(mysql_real_query(conn,requete,(unsigned int) strlen(requete)))
Ok, je ferais des edit,
J'ai essayé en enlevant la condition, mais c'est pareil, et c'est logique d'ailleur car la condition permet de voir si cela marche... Quand la fonction à bien inscrit les valeur dans les champs, elle renvoi 0.
Si quelqu'un à déja eu ce genre de problème... Je rappel que je travail sous Ubuntu (LINUX).
Merci
D'après la doc,
http://dev.mysql.com/doc/refman/5.0/...eal-query.html
La requette passée à mysql_real_query() ne doit pas être terminée par un point virgule, ce qui n'est pas le cas dans ton code.
Une autre piste serait de vérifier la validité de ta requette qui semble correcte. Il me semble néanmoins préférable pour la relecture d'indiquer le nom des champs dans la requette qui prendrait la forme
INSERT INTO nomtable (nomchamps1,nomchamps2) VALUES(valeur1,valeur2)
Attention, SQL est insensible à la casse mais mysql sous unix fait la différence minuscules / Majuscules dans le nom des tables qui correspondent à des fichiers.
Bonne soirée
Merci pour ton message,
je ferais les tests demain, avec la MAJ qu'il faut, et bien sur sans le ;
Le site que tu m'a passé est super !!
Merci
C'est bon, tout fonctionne parfaitement grâce à toi. Merci beaucoup !!
Par contre maintenant j'ai un autre gros problème, en fait cet partie enregistrement dans une base, va devoir rejoindre une autre partie, jusque la, pas de problème vous allez me dire, je vais faire une fonction qui lance l'écriture dans la base de donnée. ^^
Le problème, c'est que sur mon autre programe, je possède déja un makefile :
Et maintenant, j'aimerais ajouter dans ce makefile, les libraries MySQL, comme le makefile ci dessous :Code:
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 # $Id: Makefile,v 1.5 2008/05/21 20:22:44 mr_brain Exp $ # # Simple makefile for the libk8055 library # # change this to your distribution default # usually /usr/local or /usr PREFIX = /usr/local CC = gcc EXEC = k8055 VERSION =0.3 BINDIR = $(PREFIX)/bin LIBDIR = $(PREFIX)/lib PYLIBDIR = pyk8055 INCLUDEDIR = $(PREFIX)/include MANDIR = $(PREFIX)/man/man1 OBJS = main.o libk8055.o CFLAGS = -O2 -DDAEMON -DVERSION='"$(VERSION)"' -Wall LIBS = -lusb -L/usr/lib -lm LINK = ln libk8055.so.$(VERSION): libk8055.o $(CC) -o libk8055.so.${VERSION} $(LIBS) -shared libk8055.o -$(LINK) -sf libk8055.so.${VERSION} libk8055.so libk8055.o: libk8055.c $(CC) $(CFLAGS) -c -g -fPIC libk8055.c libk8055.a: libk8055.o ar rvs libk8055.a libk8055.o libk8055.c: k8055.h all: k8055_prog libk8055.so.${VERSION} libk8055.a .PHONY: k8055_prog k8055_prog: $(OBJS) $(CC) $(OBJS) -o $(EXEC) $(LIBS) # strip $(EXEC) pylib: $(PYLIBDIR)/libk8055.i libk8055.c export VERSION=$(VERSION); $(MAKE) -C $(PYLIBDIR) clean: rm -f *.o libk8055.so libk8055.so.$(VERSION) $(EXEC) libk8055.a @$(MAKE) -C $(PYLIBDIR) clean install: k8055_prog libk8055.so.$(VERSION) cp -f $(EXEC) $(BINDIR)/ if !(test -d $(LIBDIR)); then \ mkdir $(LIBDIR); \ fi if !(test -d $(INCLUDEDIR)); then \ mkdir $(INCLUDEDIR); \ fi cp -Pf lib* $(LIBDIR) cp -f k8055.h $(INCLUDEDIR) if !(test -d $(MANDIR)); then \ mkdir $(MANDIR); \ fi cp -f man/k8055.1.gz $(MANDIR)/ pyinstall: $(PYLIBDIR)/libk8055.i @$(MAKE) -C $(PYLIBDIR) install uninstall: rm -f $(BINDIR)/$(EXEC) $(LIBDIR)/libk8055* $(INCLUDEDIR)/k8055.h test: k8055_prog -@killall $(EXEC) ./$(EXEC)
Comment dire au prog ou se situe les libraries, dans un makefile, je n'ai jamais pu en écrire un, et j'aimerais bien le faire ^^.Code:
1
2
3
4
5
6
7
8
9
10 ALL : client MYI = -I/usr/include/mysql MYLIBS = -L/usr/include/mysql/ -lmysqlclient client : mysqlclient.c $(CC) -o client mysqlclient.c $(MYI) $(MYLIBS) clean: -rm -f *.o
Merci beaucoup.
Je viens de faire plusieurs essais mais je ne m'en sort pas....
Si je comprend bien, il va falloir que je refasse un makefile entier??
Je ne sais pas les faire :bug: