[Access] faire un select

faire un select [Access] - SQL/NoSQL - Programmation

Marsh Posté le 06-09-2007 à 15:55:49    

Bonjour,
 
Alors attention, voilà la requête :
 

SELECT * FROM Parameters;


 
Ne rigolez pas, mais ça plante !  :lol:  
 
Qu'est ce que notre ami microsoft a encore inventé comme standard SQL ?  :lol:  
 
J'ai "Syntax error in FROM clause". Qu'est ce qu'il faut faire ?  :heink:  
 
Merci.


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 06-09-2007 à 15:55:49   

Reply

Marsh Posté le 06-09-2007 à 16:03:13    

Voilà la requête générée avec le wizard :
 

SELECT Parameters.CompanyID, Parameters.CompanyName, Parameters.PaymentCurrency
FROM [Parameters];


 
faut vraiment donner cette requête à mon code Java ?  [:wam]  


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 06-09-2007 à 16:43:59    

La prochain coup que tu crées des tables sur un SGBD, renseigne toi sur les mots réservés avant.
 
Parameters est un mot réservé.
Normal donc que ça plante quand tu tentes de faire un SELECT sur un objet système.
 
Donc oui, la requête générée par le Wizard est doublement bonne car :
1/ Les [] sont le système d'échappement de Access et SQL Server. Sous MySql tu aurais eu par exemple `Parameters`
2/ Le * est à banir. J'attends avec impatience qu'un SGBD sorte un paramètre permettant de planter sauvagement lorsqu'on l'utilise autrement que via un requêteur "à la main".
 
Il y a 1000 raisons, et ces 1000 raisons ont chacune 1000 arguments abondant dans leurs sens, donc cherche pas à discuter, n'utilise pas le * dans tes programmes !
 
PS : Le prochain coup, tu crées une table "toto" et "select * from toto" marche parfaitement :spamafote:
C'est toi qu'est pas standard, à pas respecter les mots réservés des outils que tu utilises (et toc :p)

Reply

Marsh Posté le 06-09-2007 à 16:46:42    

Merci :D.


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 07-09-2007 à 13:37:29    

MagicBuzz a écrit :

La prochain coup que tu crées des tables sur un SGBD, renseigne toi sur les mots réservés avant.
 
Parameters est un mot réservé.
Normal donc que ça plante quand tu tentes de faire un SELECT sur un objet système.
 
Donc oui, la requête générée par le Wizard est doublement bonne car :
1/ Les [] sont le système d'échappement de Access et SQL Server. Sous MySql tu aurais eu par exemple `Parameters`
2/ Le * est à banir. J'attends avec impatience qu'un SGBD sorte un paramètre permettant de planter sauvagement lorsqu'on l'utilise autrement que via un requêteur "à la main".
 
Il y a 1000 raisons, et ces 1000 raisons ont chacune 1000 arguments abondant dans leurs sens, donc cherche pas à discuter, n'utilise pas le * dans tes programmes !
 
PS : Le prochain coup, tu crées une table "toto" et "select * from toto" marche parfaitement :spamafote:
C'est toi qu'est pas standard, à pas respecter les mots réservés des outils que tu utilises (et toc :p)


J'vois pas pourquoi on utiliserais pas le *. Parfois c'est plus rapide de faire * que d'avoir que les champs qu'on veut (ca depends du ratio bande passante entre le SGBD et le client et puissance CPU du SGBD).


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 07-09-2007 à 14:27:16    

C'est plus rapide à taper (et encore...).
 
C'est bien le seul cas où c'est plus rapide, et quel que soit la BP, la puissance CPU ou la mémoire disponible.
 
Mais surtout, je ne parle pas des problèmes de maintenance.
 
Combien de connecteurs BDD utilisent un index numérique pour adresser une colonne ? Il se passe quoi alors si tu inserres une colonee plutôt que de l'ajouter à la fin de la définition ?
 
Mais aussi et surtout...
T'as une belle table produit, avec un champ numérique pour son ID, un champ numeric pour son prix, et un petit varchar pour son nom.
 
Allez, un petit * c'est bien, j'ai mes trois petits champs pour faire ma petite tambouille, je suis content.
 
Maintenant, "ah ben oui, mais avec une photo ça serait vachement mieux".
Allez, on rajoute un champ de type BLOB.
 
Ah pis avec un joli texte explicatif ça serait vachement plus joli sur le site web.
Allez, on va rajouter un CLOB.
 
Ah, merde, la répression des fraudes m'oblige à mettre à disposition une copie numérique de la documentation de mes produits aux clients... Pas de problème, je vais rajouter encore un BLOB pour y coller un PDF.
 
Ah ben voilà, maintenant quand dans une page tu listes 50 produits sous forme de liste (donc le nom, le prix, et un lien pour accéder à la page de détail) qui n'utilise que tes 3 premiers champs, tu t'amuses juste à récupérer 5 ou 6 Mo de données par produit.
Faut pas venir pleurer après si l'appli tiens pas la charge et qu'Access c'est de la merde parceque c'est lent...
 
Plutôt le développeur qui au lieu de faire confiance aux personnes qui ont déjà fait les frais de ce genre de pratiques, se trouvent plus malin que tout le monde "parceque sur mon PC avec deux lignes dand la base et moi tout seul qui consulte, c'est plus rapide à écrire qu'en énumérant uniquement les champs dont j'ai besoin".
 
:spamafote:
 
PS : Et y'a encore d'autres raison. Mais celles-ci me semble quand même de loin suffisantes pour se faire une raison : *, tu le tapes dans TOAD, jamais dans ton code. Pour ça les ERP c'est très bien d'ailleurs. Une table ça fait systématiquement 50 champs, donc de toute façon avec un * tu passes plus de temps à trouver l'info dans les 800 colonnes de résultat qu'à taper le nom des champs lors de la requête :D


Message édité par MagicBuzz le 07-09-2007 à 14:28:32
Reply

Marsh Posté le 07-09-2007 à 15:03:16    

Un bon pilote SGBD/SGBD ne renvoi qu'une reference pour le BLOB et il est chargé quand on fait MaQuery.GetColonne("MON_BLOB" ).AsBlob.
 
(Aujourd'hui on utilise des Gestionnaire de persistance (mapping objet-relationel) et tu verrais les requetes que ça balance ;))
 
Apres le BLOB à la base c'est le mal. :D
Puis quand t'as une table avec 50-60 colonnes, listes les 30 colonnes dont t'as besoin c'est pas cool non plus.


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 10-09-2007 à 12:11:32    

Un bon pilote va récupérer en vitesse la page en cours de lecture, puis va préparer son cache pour tout le reste.
Notamment, sur le serveur, il va charger en arrière plan toutes les données, y compris le BLOB, afin de ne pas pas surcharger le SGBD au moment où tu vas commencer à lire dedans.
 
Donc non, il ne faut jamais récupérer ce qu'on ne veut pas lire.
 
http://dotnetjunkies.com/Article/8 [...] C11BE.dcik
Point 6.
 
N'importe quelle doc SQL indiquant ce qu'il ne faut pas faire indiquera SYSTEMATIQUEMENT le select * parmis les 10 trucs à surtout pas faire :spamafote:

Reply

Marsh Posté le 12-09-2007 à 12:50:54    

Par curiosité, MagicBuzz, tu es DBA...tu m'as d'être pas mal cultivé en BDD .


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 13-09-2007 à 16:39:39    

non, je ne suis pas dba du tout, simple développeur :)
(d'ailleurs ne me demande pas comment faire une reconstruction "propre" d'index, je sais pas faire ;))
 
mais vu que je dois souvent taper dans de grosses bases d'ERP sous divers SGBD, j'ai pas mal potassé les mécanismes d'interrogation des bases de données.


Message édité par MagicBuzz le 13-09-2007 à 16:40:11
Reply

Marsh Posté le 13-09-2007 à 16:39:39   

Reply

Marsh Posté le 14-09-2007 à 01:24:41    

OK très bien.
 
Bon une autre question "access" :D. Ma requête update marche pas :/. Ca peut venir d'où ?
 

UPDATE History set BatchNumber = '002543', CompanyId = 'SARLEUR',Currency = 'EUR', User_Crt = 'Francois', Date_Crt = '20070914', Time_Crt = '01h08m18s', Process_Crt = '/jsp/report_extraction.jsp', User_Vldt ='', Date_Vldt = '', Time_Vldt ='', Process_Vldt ='', User_Rlsd = '', Date_Rlsd ='', Time_Rlsd = '', Process_Rlsd ='', User_Rjct = '', Date_Rjct = '', Time_Rjct = '', Process_Rjct = '', User_Paid = '', Date_Paid = '', Time_Paid ='', Process_Paid = '', File_Name = '/data/UBS_SARLEUR_EUR_09-14-2007_01h08m18s.txt', Last_Status = 'CreatedCreated' WHERE BatchNumber = '002543', CompanyId = 'SARLEUR',Currency = 'EUR';


 
N.B. : les 25 colonnes de la table History sont de type texte.


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 14-09-2007 à 01:36:26    

Bon déjà y'a l'erreur des 'and' dans le WHERE à la places des virgules...mais ça plantait encore et j'ai trouvé d'où ça vient !
 
Currency est un mot clé !   :lol:  :lol:  :lol:  :lol:  :lol:  :lol:  
 
Faut vraiment que j'écoute MagicBuzz, sinon jvé finir par tous les utiliser.  :lol:  :lol:  :lol:  :lol:


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 14-09-2007 à 08:55:16    

Y'a une technique qui existe, c'est de prefixer les champs.
 
Par exemple tu prefixe tout par HIS_ ... ;)


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 14-09-2007 à 09:34:42    

C'est exactement ce que j'ai fait !...non mais jvé pas changer le nom de toutes mes colonnes à cause d'Access ! :D.


---------------
Asus P5Q Pro | C2D E8400 3GHz@4GHz + Noctua NH-C12P | 2x2Go Patriot Extreme PC-8500 | GeForce GTX 460@Stock 1Go GLH | Crucial SSD M4 64Go Sata3
Reply

Marsh Posté le 14-09-2007 à 12:25:00    

Sinon, tu mets simplement les colonnes qui ont un nom réserver entre crochets...
 
[Currency] sera compris par access comme le champ "currency".
 
Autre élément, tu utilises la syntaxe complète :
 
History.Currency = ...
 
=> "logiquement" Access devrait comprendre qu'il s'agit d'un champ (c'est à tester, parcequ'Access ça reste Access quand même ;) )

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed