Section DATABASE

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Section DATABASE

Message par falsam »

Il existe une section jeux dans ce forum. Pourquoi pas une section Base de données ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Warkering
Messages : 808
Inscription : ven. 08/janv./2010 1:14
Localisation : Québec, Canada

Re: Section DATABASE

Message par Warkering »

T'es un calé SQL? :P
Cela pourrait être utile, c'est vrai qu'il y a un bon nombre de topics sur ce sujet.
Warkering
Messages : 808
Inscription : ven. 08/janv./2010 1:14
Localisation : Québec, Canada

Re: Section DATABASE

Message par Warkering »

Il n'y a pas que MySQL non plus!
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Section DATABASE

Message 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)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
anissa
Messages : 136
Inscription : mer. 13/oct./2010 15:43

Re: Section DATABASE

Message 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
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Section DATABASE

Message 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 !! :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Section DATABASE

Message 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.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Section DATABASE

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
anissa
Messages : 136
Inscription : mer. 13/oct./2010 15:43

Re: Section DATABASE

Message 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.
Répondre