Page 1 sur 1
Section DATABASE
Publié : lun. 18/oct./2010 16:30
par falsam
Il existe une section jeux dans ce forum. Pourquoi pas une section Base de données ?
Re: Section DATABASE
Publié : lun. 18/oct./2010 16:34
par Warkering
T'es un calé SQL?
Cela pourrait être utile, c'est vrai qu'il y a un bon nombre de topics sur ce sujet.
Re: Section DATABASE
Publié : lun. 18/oct./2010 16:44
par Warkering
Il n'y a pas que MySQL non plus!
Re: Section DATABASE
Publié : lun. 18/oct./2010 17:01
par falsam
@Mekkisoft : Ma demande n'est pas axée sur Mysql exclusivement, d'autant plus que MySql n'est pas natif dans PureBasic. Purebasic supporte en natif SQLite et PostgreSQL.
@Wakering :J'ai quelques connaissance en base de donnés mais peut être pas suffisamment pour être si calé que ça.
D'autres par je suis surtout un peu dérouté par le jeu d'instruction de la bibliothèque database.
un exemple: Pourquoi avoir l'instruction DatabaseQuery et DatabaseUpdate ?
Pourquoi la requete "select * from mytable" exécutée par DatabaseQuery, serait différente de "Delete from mytable where mycondition" exécutée par DatabaseUpdate.
En langage Php quelques soit la requête on utilise mysql_query($strSQL). Pourquoi il n'en est pas de même avec Pure basic ?
Dans d'autres langages, INSERT, UPDATE, DELETE, DROP, etc., retourne TRUE en cas de succès ou FALSE en cas d'erreur.
En pure basic on sait par exemple que la requête "Delete from mytable where mycondition" est correctement exécuté meme si l'enregistrement n'existe pas !! C'est très surprenant. (Ou alors j'ai fait une erreur dans mon code que je n'ai pas vu :p)
Re: Section DATABASE
Publié : lun. 18/oct./2010 19:22
par anissa
Pourquoi avoir l'instruction DatabaseQuery et DatabaseUpdate ?
Parce que leur fonctions sont différentes:
1. DatabaseQuery sert à filtrer des enregistrements qui répondent aux critères fixés par la commande SELECT
2. DatabaseUpdate exécute une opération de mise à jour sur un fichier (création d'un nouvel enregistrement, modification ou suppression d'un enregistrement).
Pourquoi la requete "select * from mytable" exécutée par DatabaseQuery, serait différente de "Delete from mytable where mycondition" exécutée par DatabaseUpdate.
Tout simplement parce que la première consiste à sélectionner des enregistrements (comme expliqué en 1), tandis que la seconde, elle consiste à mettre à jour le contenu d'un fichier.
En langage Php quelques soit la requête on utilise mysql_query($strSQL). Pourquoi il n'en est pas de même avec Pure basic ?
Tout simplement parce que les deux opérations se font (une à une) grâce à une seule instruction mais définie par une ou plusieurs conditions (dans $strSQL)
Dans d'autres langages, INSERT, UPDATE, DELETE, DROP, etc., retourne TRUE en cas de succès ou FALSE en cas d'erreur.
Pure pasic aussi retourne toujours une valeur (1 ou 0, remplaçant true ou false justement)
En pure basic on sait par exemple que la requête "Delete from mytable where mycondition" est correctement exécuté meme si l'enregistrement n'existe pas !! C'est très surprenant.
Oui c vrai, mais vous pouvez demander à purebasic de vous retourner l'état de l'exécution en ajoutant un IF avant l'instruction DatabaseUpdate.
Anissa
Re: Section DATABASE
Publié : lun. 18/oct./2010 21:32
par falsam
Anissa merci de vos réponses mais malheureusement ne m'apportent pas de réponse.
Voici un code exemple qui montre par exemple qu'une requete de suppression d'un enregistrement me retournera une réponse Vrai (Valeur 1) alors que cet enregistrement n'existe pas.
Ce qui me laisse à penser que ce code retour ne fait que dire que la requête a bien été exécuté, mais ce qui est demandé n'est pas vérifié.
Il aurait été bon que la requête retourne le nombre d'enregistrement concerné par la requête.
Code : Tout sélectionner
UseSQLiteDatabase()
Enumeration
#MaBase; Base de données
EndEnumeration
ReqSql.s ;Requéte SQL
;Creation de la base de données
If CreateFile(#MaBase,"mabase.db3")
CloseFile(#Mabase)
EndIf
If OpenDatabase(#MaBase, #PB_Compiler_FilePath+"/mabase.db3", "", "", #PB_Database_SQLite)
;Création de la table
ReqSql="Create Table MaTable (nom Char(10), id Char(2))"
DatabaseUpdate(#MaBase, ReqSql)
;J'insere quelques enregistrement pour le test
ReqSql= "insert into matable (nom, id) values ('Alain','1')"
DatabaseUpdate(#Mabase, ReqSql)
ReqSql = "insert into matable (nom, id) values ('Marc','2')"
DatabaseUpdate(#Mabase, ReqSql)
ReqSql = "insert into matable (nom, id) values ('Durand','3')"
DatabaseUpdate(#Mabase, ReqSql)
;Suppression des enregistrement dont le code id=1
ReqSql="delete from MaTable where id='1'"
Debug DatabaseUpdate(#Mabase, ReqSql)
;Suppression des enregistrement dont le code id=5 alors que l'enregistrement n'existe pas.
ReqSql="delete from MaTable where id='5'"
Debug DatabaseUpdate(#Mabase, ReqSql)
FinishDatabaseQuery(#Mabase)
CloseDatabase(#MaBase)
EndIf
J'ai comme solution pour le moment, d’exécuter une requête
select pour vérifier que l'enregistrement a bien été supprimer !!

Re: Section DATABASE
Publié : mar. 19/oct./2010 8:42
par Cls
Je trouve qu'une section Base de données n'est pas une mauvais idée.
Concernant ton problème, il faut te faire un jeu de fonction qui vérifiera que l'enregistrement existe avant de faire ton ajout/édition/suppression. Du coup il y aura 2 niveaux de contrôle : un niveau technique , la requête a - t - elle fonctionnée ou pas ? ; et un niveau fonctionnel, l'enregistrement que je souhaitais modifié était - il disponible ?
En natif ce n'est pas géré afin de coller au plus grand nombre de SGBD.
Re: Section DATABASE
Publié : mar. 19/oct./2010 9:42
par falsam
Cls a écrit :... En natif ce n'est pas géré afin de coller au plus grand nombre de SGBD.
D'aprés ce que je lis
sur ce lien consacré à la norme SQL
DELETE efface les enregistrements de nom_de_table qui satisfont la condition donnée par clause_where, et retourne le nombre d'enregistrements effacés.
Pour le moment j'effectue une requête Select pour vérifier que mon ou mes enregistrements sont bien supprimés.
Merci pour ta réponse Cls
Re: Section DATABASE
Publié : mar. 19/oct./2010 12:36
par anissa
Oui tu as raison, comme a dit Cls, le meilleur contrôle est de vérifier d'abord l'existence de l'enregistrement avant de le modifier ou le supprimer. Au fait, les valeurs retournées par
Pure basic concerne seulement le côté syntaxique de l'instruction, comme quoi l'instruction a bien été exécutée mais sans dire si oui ou non l'enregistrement a été bel et bien supprimé par exemple. De toute façon, en ce qui me concerne, je vérifie toujours l'existence d'un enregistrement avant de le supprimer ou modifier.