La concaténation de chaîne rend ton programme sensible au injections SQL. Il faut utiliser des paramètres (DbParameter).
Version imprimable
De l'injection SQL, oui effectivement, encore faut-il pour cela intercepter la requête tous les paramètres son contrôlé au part avant, et ne viennent pas de formulaire ;)
De plus ce n'est pas pour de l'internet mais de l'intranet et pour le moment pour avoir accès au seul formulaire disponible dans l'application, (celui où l'on entre les paramètres de la base de donnée) il faut d'abord ce loguer avec un compte "Admin local" donc une personne qui sait ce qu'elle fait ;) et surtout qui à déjà accès au info de la base de donnée ;)
Cependant merci de m'y faire penser:zoubi:
D'après ce que j'ai pus constater, dans ce lien que tu m'avais envoyé, il recharge l'intégralité de la connexion pour chaque requête... c'est pas un peu lourd?
et n'est-il pas plus "best practice" de faire des singleton pour les connexions?
Une chance que je n'utilise pas de requêtes en ce sens alors ;)
sinon petite remarque
Sauf erreur de ma part le framework est utilisé non? (cf les caractères gras)
Ou bien faudrait m'expliquer la différence...
J'ai essayé de repartir à zéro, et d'utiliser les Interfaces mis à ma disposition par le framework et j'en reviens aux mêmes fonctions qu'avaient bossun, le dataAdapter en moins...
Outre le problème des injections SQL, le fait de faire des requêtes paramétrées peux te faire gagner du temps car pour le SGBD la requête sera la même seul les paramètres changeront contrairement à une requête issue de concaténation, donc il utilisera le cache.
J'ai testé le phénomène sur une base ORACLE contenant plus d'un millier de table et ma table comprenait environ 9 millions d'enregistrement. La différence était assez flagrante.
ok merci pour l'info c'est vrai que le premier lancement de l'application (avec les paramètres de la base insérer) est un peu lent vue qu'on commence par remplir les tables automatiquement ^^
Sinon dans le liens pour le Framwork
Lorsque je vois ça! je ris jaune...
je m'explique, je rentre dans ma fonction via un boucle type :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public static void NonSelect() { // Creation de la fabrique DbProviderFactory factory = DbProviderFactories.GetFactory( ConfigurationManager.ConnectionStrings["ChaineDeConnexion"].ProviderName); // Objet connection using (IDbConnection connection = factory.CreateConnection()) { connection.ConnectionString = ConfigurationManager.ConnectionStrings["ChaineDeConnexion"].ConnectionString; connection.Open(); // Objet Command using (IDbCommand command = factory.CreateCommand()) { command.CommandText = "UPDATE usr_contract set ctr_n = ctr_n + 1"; command.Connection = connection; // On indique que l'on souhaite utiliser du texte command.CommandType = CommandType.Text; // On execute la commande Debug.WriteLine("Nombre de lignes affectéees {0}", command.ExecuteNonQuery()); } } }
Tant qu'il y a des chose à insérer je continue...
donc en résumé
boucle une
dois-je inséré quelque chose oui!
je rentre dans la fonciton
je créé ma factory !
je récupère/créé ma chaine de connexion...!
j'ouvre ma connexion
je créé ma commande
je l'exécute
je ferme
je sors
boucle 2
dois-je inséré quelque chose oui!
je rentre dans la fonciton
je créé ma factory !
je récupère/créé ma chaine de connexion...!
j'ouvre ma connexion
je créé ma commande
je l'exécute
je ferme
je sors
[...]
Boucle N
dois-je inséré quelque chose oui!
je rentre dans la fonciton
je créé ma factory !
je récupère/créé ma chaine de connexion...!
j'ouvre ma connexion
je créé ma commande
je l'exécute
je ferme
je sors
[...]
Boucle N+X
dois-je inséré quelque chose oui!
je rentre dans la fonciton
je créé ma factory !
je récupère/créé ma chaine de connexion...!
j'ouvre ma connexion
je créé ma commande
je l'exécute
je ferme
je sors
[...]
Lorsque je rentre une deuxième fois dans la même fonction je dois à nouveau créé ma factory et ma chaîne connexion... 8O
Et lorsque j'essaie de sortir les premières étape de la fonction, pour les "généralisé" je reviens à faire le même type de classe que jossun...
Je voulais dire d'éviter les wrappers. A mon avis, le framework se suffit à lui-même dans ce cas précis.
Très drôle en effet... Et je ne te parle même pas des fois où il faut ajouter une transaction. Pas la peine de te vexer. En l'occurence, tu as sans doute remarqué que la méthode est statique.
En tant que tel, elle est obligée d'utiliser d'autres propriétés ou méthodes statiques ou bien de déclarer des instances dans son "corps".Code:
1
2
3
4 public static void NonSelect() { // corps de la méthode }
Tu le savais aussi sans doute, les objets utilisants des ressouces disposables doivent eux-même implémenter l'interface IDisposable. Or les méthodes statiques ne peuvent pas être "interfacées". Elle ne peuvent donc pas implémenter IDisposable ni utilser des objets disposables en dehors de leur "corps". Même si c'est techniquement possible, personnellement j'évite. Il n'est pas possible de partager la même connexion avec deux requêtes simultanées. Dans le cas de requêtes imbriquées ou programmation parallèle cela provoque des plantages.
Et sinon, les pools de connexions n'ont plus de secrets pour toi j'imagine.
L'essentiel c'est que cela marche :)