Procédures stockées sous Access [C++.Net] - SQL/NoSQL - Programmation
Marsh Posté le 18-10-2005 à 11:34:51
Salut,
Alors, Access gère deux types de vues/procédure stockées
Soit c'est une requête enregistrée, soit une macro. Pour les macros, à priori, impossible de les lancer sans créer une instance du logiciel Access depuis ton programme.
Pour les requêtes paramètrées, si elle est de type "select", alors c'est facile, l'appelle comme une simple requête.
Pour les autres types de requêtes (update, insert, delete), là, j'ai un doute, car je ne l'ai jamais fait.
A mon avis, tu fais un bête appel au nom de la requête comme si tu allais lancer une procédure stockées, avec un objet "ADODB.Command".
A tester.
Marsh Posté le 18-10-2005 à 11:49:48
J'ai créé une table "test" (id, val)
J'ai créé une requêtes d'insertion "query1" (INSERT INTO tst ( val ) VALUES ()
Et dans un programme (en C#, je n'ai pas installé C++), ça donne :
Code :
|
(voir la partir du bouton pour voir l'appel à la requête)
Marsh Posté le 18-10-2005 à 11:51:06
Et ça marche :
id val
1 test
2 test de val
=> La première ligne, je l'ai créée depuis Access pour tester la requête
=> La seconde ligne a bien été créée depuis le programme
Marsh Posté le 18-10-2005 à 11:52:53
T'ain, y'a pas à dire, Access c'est assez limité, mais mine de rien c'est quand même vachement puissant et simple d'emplois
Et dire que je viens de faire un truc en 10 minutes alors que je ne l'avais jamais fait !
Marsh Posté le 18-10-2005 à 17:24:49
Wow merci beaucoup Arjuna, j'essaie ça cette apres midi et je t'en reparle
Sinon pour les contraintes sous Access vous savez si ça se fait? Vérifier les valeurs reçues dans la requête directement au lieu de les vérifier avant de les envoyer?
Marsh Posté le 18-10-2005 à 19:18:28
Donne un exemple de ce que tu veux faire.
Pour moi, une contrainte, c'est pas au moment de la requête que c'est fait (du moins, c'est pas dans la requête) mais directement au moment de la modification d'une valeur, au niveau de la table.
Access supporte quelques contraintes, genre masque ou calcul, mais j'ai vu ça pendant 15 minutes sous Access 2 il y a 7 ans pendant mes études, alors je peux pas trop t'en dire plus
Dans Access, lors de la modification de la table (mode design), t'as deux champs :
Expression => A priori, c'est la valeur par défaut, mais ça peut peut-être aussi faire office de règle
Format (ou masque, de tête je sais pas) => Là, tu peux au moins imposé un masque de saisie, mais je ne sais pas si tu peux lui faire faire des traîtements plus complexes. Si tu sais faire dans SQL Server sans passer par l'écran dédié aux contraintes ni par le SQL, alors c'est pareil (dans l'écran de design d'une table dans Entreprise Manager, mais je ne sais pas plus m'en servir de celui-là )
Marsh Posté le 18-10-2005 à 19:24:02
Pour les contraintes, c'est le Framework qui s'en charge...
Enfin ça dépend. Si t'utilises des DataSets et des DataAdapters, ça va râler si tu remplis le DataSet avec des mauvaises données. Pareil lors de la mise à jour via le DataAdapter.
Marsh Posté le 18-10-2005 à 19:38:43
Perso, moins le FrameWork en fait, et mieu je me porte :
1) C'est pas lui le SGBD
2) C'est dont pas à lui de garantir la bonne santé des données
3) Même s'il offre un tas de règles, n'étant pas centralisé il reste un gruyère
4) Si un autre soft (ancienne version, ou autre) vient se connecter à la base, il passera à travers de tes règles prises en charge par le Framework.
En résumé, pour moi, les checks effectués dans le FrameWork ne doivent servir qu'à réduire le nombre d'erreurs gérées par le SGBD, en aucun cas à réduire la sécurité des données sur ce dernier.
Genre, si un champ est obligatoire dans un formulaire HTML, tu va mettres un JavaScript qui va empêcher la validation si le champ est vide.
Ensuite, dans le PHP, tu vas vérifier que le champ est bien rempli.
Et enfin, la base est setupée avec un champ "not null" et "chaîne vide interdite".
Tu peux virer les contraintes dans le même ordre. Mais il ne faut jamais prendre en aval pour argent comptant les traitements effectués en amont, rien ne les garantis (par contre l'inverse doit être vrai).
Tu poste une lettre avec AR à la poste : rien ne te garanti que le destinataire va la recevoir.
Tu reçois l'AR, tout te garanti que le destinataire l'a reçue.
En informatique, ça marche comme ça : les couches de bas niveau ne doivent en aucun cas faire confiance aux couches proches de la GUI. Par contre la GUI doit pouvoir avoir une confiance aveugle envers les couches de bas niveau.
Marsh Posté le 18-10-2005 à 19:41:54
Enfin, quand je dis "Pareil lors de la mise à jour via le DataAdapter.", c'est le SGBD en dessous qui râle Donc la vérif des données viens bien de Access.
Après y'a effectivement une vérification supplémentaire faite par le Framework pour ce qui est des Datasets, mais parfois des choses qui rentrent dans le Dataset ne rentre pas dans le SGBD en dessous.
Marsh Posté le 20-10-2005 à 04:12:59
Merci les gars
Les requetes fonctionnent sous access mais pas les contraintes, alors on a décider de les faire dans le code direct.
Mille mercis!
Marsh Posté le 20-10-2005 à 11:52:49
Comment ça les contraintes ne marchent pas ?
Attends que je fasse un test histoire de vérifier un truc.
Mais déjà, dis-nous de quelle contrainte tu parles : un exemple concret.
Marsh Posté le 20-10-2005 à 12:13:53
En effet, c'est pire que "ça marche pas"...
J'ai créé une règle. Dans Access, tout marche bien, il fait tous les checks nécessaires.
Mais depuis un programme, non seulement il ne fait pas les checks, mais surtout, il plante systématiquement les requêtes !
J'ai mis dans "validation rule" de mon champ :
like "A*"
si mon prog insère "toto", ça plante.
"Atoto" marche.
un peu de doc sur cs validation rules :
Citation : |
Marsh Posté le 17-10-2005 à 22:03:52
Salut à tous,
j'aimerais savoir comment faire des procédures stockées sous Access et comment y accéder via C++.Net. Je crois qu'Access appelle ça des Requête Eenregistrées, mais j'ai besoin de requêtes pouvant avoir des contraintes. Par exemple, je reçois un paramètre dans ma procédure, et je veux valider le paramètre. En SQL on le fait à l'aide de CONSTRAINT. Donc j'aimerais que tout mon code de vérification se fasse dans ma bd Access. De cette façon, je n'ai qu'à appeler ma procédure SQL à partir de mon programme C++ et je peux lui lancer n'importe quoi en paramètres, car la bd s'occupe de la vérification et renvoie une erreur s'il y a lieu.
Est-ce possible de faire cela avec Access (2003 ou 2002)? C'est possible avec Oracle, je le sais, mais raison de portabilité, Access sera plus convivial à mon projet.
Merci,
Alpha