Gambas France BETA


Pas de compte ? Incription

modifier plusieurs ligne sous sqlite

Ce sujet est résolu.

1
AuteurMessages
spheris#1 Posté le 23/2/2023 à 16:06:33
Bonjour,
JE bloque sur un souci avec sqlite.
Je sais modifier une ligne avec la commande:

1
monresultat = maconnexion.edit("matable", "id=" & monid)


mais quel est le code pour :

Modifier tous les champs de la colonne monalbum pour mettre le texte "hello" seulement si les champs de la colonne mavoiture ont le texte Pigeot ?

J'ai essayé cela mais cela ne fonctionne pas :

1
2
sql = "UPDATE matable SET monalbum='hello' WHERE mavoiture='Pigeot'"
monresultat = maconnexion.Exec(sql)

Patrick#2 Posté le 23/2/2023 à 16:43:36
Bonjour,
A mon sens la requête est correcte, l'erreur doit plutôt se trouver dans la condition WHERE. J'ai pris l'habitude d'écrire mes requêtes comme ceci :
1
monresultat = maconnexion.Exec("UPDATE matable SET monalbum= &1 WHERE mavoiture= &2","hello","Pigeot")

Pour que les données soient toujours passées correctement.
spheris#3 Posté le 23/2/2023 à 18:38:52
Peut être est-ce la suite qui pose souci:

1
2
3
4
monresultat = maconnexion.Exec("UPDATE matable SET monalbum= &1 WHERE mavoiture= &2", "hello", "Pigeot")
monresultat.Update()
maconnexion.Commit()
maconnexion.Close()


Dois-je juste écrire cela ou je dois mettre une boucle FOR EACH?
valaquarus#4 Posté le 23/2/2023 à 21:50:31
-- Unus Ex Altera --Un petit lien sur SQL : SQL

Valaquarus

Ajoute un délai avant la fermeture de la connexion

1
2
3
4
5
monresultat = maconnexion.Exec("UPDATE matable SET monalbum= &1 WHERE mavoiture= &2", "hello", "Pigeot")
monresultat.Update()
maconnexion.Commit()
WAIT 2
maconnexion.Close()
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
Patrick#5 Posté le 24/2/2023 à 06:55:57
Il y a deux façons de faire, soit on utilise les outils de Gambas :
1
2
3
4
5
6
7
8
9
monresultat = maconnexion.edit("matable", "mavoiture= &1", "Pigeot)"
IF monresultat.Available THEN
maconnexion.Begin
REPEAT
monresultat!monalbum="hello"
monresultat.Update
UNTIL monresultat.MoveNext()
maconnexion.Commit
ENDIF

Soit on utilise le langage SQL :
1
monresultat = maconnexion.Exec("UPDATE matable SET monalbum= &1 WHERE mavoiture= &2", "hello", "Pigeot")

Wait sert à déclencher une boucle d'événement et on ferme la connexion que quand le programme se termine.
spheris#6 Posté le 24/2/2023 à 09:01:34
Merci à vous deux mais je ne comprends pas du tout mon problème. Je vais résumer :

J'ouvre ma bdd comme ceci :

1
2
3
4
5
6
PRIVATE sql AS STRING

maconnexion.Type = "sqlite3"
maconnexion.Host = Application.Path
maconnexion.Name = "document.db"
IF NOT maconnexion.Opened THEN maconnexion.Open()


Ensuite pour une lecture de plusieurs lignes avec deux conditions:

1
2
3
4
sql = "SELECT * FROM matable WHERE mavoiture='Pigeot' AND mymodel='cabriolet'"
monresultat = maconnexion.Exec(sql)
PRINT monresultat.Count
maconnexion.Close()


Ce code me renvoi bien le nombre 21, correspondant à 21 occurences.

Maintenant, si je veux éditer la bdd, je veux que toutes les Pigeots deviennent des Rino.

j'écris:

1
2
3
4
5
6
7
sql = "UPDATE matable SET mavoiture= 'Rino' WHERE mymodel= 'cabriolet'"
monresultat = maconnexion.Exec(sql)
PRINT monresultat.Count
monresultat.Update()
maconnexion.Commit()
WAIT 1
maconnexion.Close()


Et là le logiciel plante , me renvoi 0 et me dit Result not available.

Pourquoi sachant que les données sont bien présentes dans la bdd?



Patrick#7 Posté le 24/2/2023 à 10:26:59
Autant pour moi, la bonne syntaxe est :
1
maconnexion.Exec("UPDATE matable SET monalbum= &1 WHERE mavoiture= &2", "hello", "Pigeot")

UPDATE ne renvoi pas de résultat ni d'erreur et fait parti du langage SQL, du coup tous ci dessous :
1
2
3
4
5
PRINT monresultat.Count
monresultat.Update()
maconnexion.Commit()
WAIT 1
maconnexion.Close()

N'a pas lieu d'être.
Si ça ne fonctionne pas il faut aller chercher dans la clause WHERE.

Personnellement j'ai une un alfa spider 2000 de 1989 ...
valaquarus#8 Posté le 24/2/2023 à 11:05:08
-- Unus Ex Altera --Je serais du même avis que Patrick :
1
2
3
4
5
6
7
8
9
monresultat = maconnexion.edit("matable", "mavoiture= &1", "Pigeot)"
IF monresultat.Available THEN
maconnexion.Begin
REPEAT
monresultat!monalbum = "hello"
monresultat.Update
UNTIL monresultat.MoveNext()
maconnexion.Commit
ENDIF
, soit on utilise SQL dans Gambas soit on utilise les outils Gambas pour manipuler une base de données, ce qui est plus efficace et contrôlable :
DB
How To Open a SQLite connection and use it
L'utilisation de DB et de ses méthodes statiques est plus confortable que l'utilisation du langage SQL.

Valaquarus

Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.5
spheris#9 Posté le 24/2/2023 à 13:08:28
Merci pour vos réponses, mais je dois passer à coté, car je ne saisi pas du tout.
Pour mon exemple quel serait le code pour la solution?
LE code fournit par Patrick me renvoit une erreur : Result not available.

Edition :
Pardon je viens de comprendre :D :D
1