IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Retour de requête SQL


Sujet :

C#

  1. #1
    Membre régulier
    Homme Profil pro
    BAC +3
    Inscrit en
    Octobre 2018
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : BAC +3

    Informations forums :
    Inscription : Octobre 2018
    Messages : 164
    Points : 92
    Points
    92
    Par défaut Retour de requête SQL
    Bonjour j'aimerais avoir des infos sur comment utiliser une réponse SQL du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /*Je fais ma requête SQL */
     
    var query = " SELECT * FROM table1 WHERE A=B "; // (Exemple)
    if ( {La requète renvoie quelque chose} )
    .....
    else
    .....
    Je ne sais pas si c'est clair ,
    merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Le problème ici est que tu ne nous dis pas comment tu lances la requête en question.
    Est-ce que tu utilises Entity Framework, System.Data.Odbc, autre chose ?

    Tatayo.

  3. #3
    Membre régulier
    Homme Profil pro
    BAC +3
    Inscrit en
    Octobre 2018
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : BAC +3

    Informations forums :
    Inscription : Octobre 2018
    Messages : 164
    Points : 92
    Points
    92
    Par défaut
    Bonjour alors , le programme est sur Visual Studio en C# et je lance une requête sur ma BDD sur PhpMyAdmin

    J'ai potentiellement trouvé une solution avec ExecuteScalar (qui indique le nombre de ligne retournée par la requête SQL ) cependant il me retourne l'erreur suivante :
    System.NullReferenceException*: 'La référence d'objet n'est pas définie à une instance d'un objet.'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    private void Button_Home_Connection_Click(object sender, EventArgs e)
            {
                MySqlConnection connection = new MySqlConnection("SERVER=localhost; DATABASE=travellocked; UID=root; PASSWORD=");       // Connection avec la base de données PHP MYAdmin
                bool connection_statut = false;
                int result = 0;
     
                var query = " SELECT * FROM tb_agent WHERE Identifiant= " + "'" + TextBox_Home_ID.Text + "'" + " AND Motdepasse=" + "'" + TextBox_Home_MDP.Text + " ' ";
     
                MySqlCommand cmd = new MySqlCommand(query, connection);
                result = (int)cmd.ExecuteScalar();
     
     
                if (result > 0 )
                {
                    try    //Le programme essaye de se connecté pour retourner une valeur booléenne à l'état de connection.
                    {
                        connection.Open();
                        connection_statut = true;
                        MessageBox.Show("CONNEXION REUSSIE");
                    }
                    catch (MySqlException co)    //Le cas d'un échec de connection
                    {
                        connection.Close();
                        MessageBox.Show(co.ToString());
                        MessageBox.Show("Connexion échouée");
                        connection_statut = false;
                    }
                }
                else
                {
                    MessageBox.Show("L'indentifiant ou le mot de passe est incorrect ?");
                }
            }

  4. #4
    Membre régulier
    Homme Profil pro
    BAC +3
    Inscrit en
    Octobre 2018
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : BAC +3

    Informations forums :
    Inscription : Octobre 2018
    Messages : 164
    Points : 92
    Points
    92
    Par défaut
    J'ai finalement trouvé seul.

    Merci pour tout voici le code réussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    bool connection_statut = false;
     
                MySqlConnection connection = new MySqlConnection("SERVER=localhost; DATABASE=travellocked; UID=root; PASSWORD=");       // Connection avec la base de données PHP MYAdmin
                var query = " SELECT * FROM tb_agent WHERE Identifiant= " + "'" + TextBox_Home_ID.Text + "'" + " AND Motdepasse=" + "'" + TextBox_Home_MDP.Text + " ' ";
                MySqlCommand cmd = new MySqlCommand(query, connection);
                connection.Open();
                Object obj = cmd.ExecuteScalar();
                connection.Close();
     
     
                if (obj != null )
                {
                    try    //Le programme essaye de se connecté pour retourner une valeur booléenne à l'état de connection.
                    {
                        connection.Open();
                        connection_statut = true;
                        MessageBox.Show("CONNEXION REUSSIE");
                    }
                    catch (MySqlException co)    //Le cas d'un échec de connection
                    {
                        connection.Close();
                        MessageBox.Show(co.ToString());
                        MessageBox.Show("Connexion échouée");
                        connection_statut = false;
     
                    }
                }
                else
                {
                    MessageBox.Show("L'indentifiant ou le mot de passe est incorrect ?");
     
                }

  5. #5
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Quel est l'intérêt de fermer la connexion (ligne 9) pour la ré-ouvrir juste après (ligne 16). Par ailleurs je vois dans la même page de code une requête SQL codée en dur et un message d'erreur fonctionnel (erreur d'authentification), ce qui me laisse à penser que ton code mélange plein de choses qui dans l'idéal devraient être séparées.

  6. #6
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par BiRoy Voir le message
    J'ai potentiellement trouvé une solution avec ExecuteScalar (qui indique le nombre de ligne retournée par la requête SQL )
    ExecuteScalar ne renvoie pas le nombre de lignes, mais la première colonne de la première ligne du résultat.

    Pour récupérer les informations, ExecuteReader est ce qu'il te faut

    Je t'invite également a regarder du côté des requêtes paramétrées, pour éviter de construire des requêtes SQL comme tu le fais. C'est une pratique généralement mauvaise quand des entrées proviennent d'une source non fiable comme un utilisateur, car cela ouvre la voie à des attaques de types "injection SQL".
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  7. #7
    Membre confirmé Avatar de joKED
    Profil pro
    Imposteur en chef
    Inscrit en
    Février 2006
    Messages
    337
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Imposteur en chef

    Informations forums :
    Inscription : Février 2006
    Messages : 337
    Points : 458
    Points
    458
    Par défaut
    Bonjour,

    Je "plussune" les intervenants précédents sur les problèmes évoqués (code non structuré, risque d'injection sql), et j'ajoute aussi, en voyant ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Motdepasse=" + "'" + TextBox_Home_MDP.Text + " '
    qu'on peut légitimement penser que les mots de passe sont stockés en clair dans la base de données, ce qui est une très mauvaise pratique.
    Tant va la cruche à l'eau qu'à la fin y'a plus d'eau.

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    le verbe officiel est plussoyer (je plussoie ...)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre confirmé Avatar de joKED
    Profil pro
    Imposteur en chef
    Inscrit en
    Février 2006
    Messages
    337
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Imposteur en chef

    Informations forums :
    Inscription : Février 2006
    Messages : 337
    Points : 458
    Points
    458
    Par défaut
    Merci de la précision. Et ça fait plus de points au Scrabble.
    Tant va la cruche à l'eau qu'à la fin y'a plus d'eau.

  10. #10
    Membre régulier
    Homme Profil pro
    BAC +3
    Inscrit en
    Octobre 2018
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : BAC +3

    Informations forums :
    Inscription : Octobre 2018
    Messages : 164
    Points : 92
    Points
    92
    Par défaut
    Citation Envoyé par joKED Voir le message
    Bonjour,

    Je "plussune" les intervenants précédents sur les problèmes évoqués (code non structuré, risque d'injection sql), et j'ajoute aussi, en voyant ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Motdepasse=" + "'" + TextBox_Home_MDP.Text + " '
    qu'on peut légitimement penser que les mots de passe sont stockés en clair dans la base de données, ce qui est une très mauvaise pratique.
    L'utilisation de procédures stockées peut-elle pallier aux injections ?

    Citation Envoyé par Noxen Voir le message
    Quel est l'intérêt de fermer la connexion (ligne 9) pour la ré-ouvrir juste après (ligne 16). Par ailleurs je vois dans la même page de code une requête SQL codée en dur et un message d'erreur fonctionnel (erreur d'authentification), ce qui me laisse à penser que ton code mélange plein de choses qui dans l'idéal devraient être séparées.
    Si je ne l'ouvre et ferme pas autour du "Execute" j'ai obligatoirement une erreur..

  11. #11
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 670
    Points : 5 242
    Points
    5 242
    Par défaut
    Ce que Noxen veux dire c'est que tu fait un Close à la ligne 9 puis tu refais un Open à la ligne 16.
    Et, en effet, si tu enlève le Close de la ligne 9, tu n'a plus besoin du Open à la ligne 16.

    ça permettra également de supprimer une autre d'incohérence : le try-catch initié en ligne 14 ?
    Si ton Open passe en ligne 7, il n'y a aucun raison qu'il plante en ligne 16.

    A quoi sert le booléen connection_statut ?
    Il est local et n'est donc pas utilisé ailleurs.

    Edit :
    Voici une version plus sécurisée car elle utilise une requête paramétrée et qui ne mélange pas traitement et IHM :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    private Boolean CheckStatus(String identifier, String password)
    {
        using (MySqlConnection connection = new MySqlConnection(connectionString))
        {
            using (MySqlCommand command = new MySqlCommand())
            {
                command.Connection = connection;
                command.Parameters.Add("@Identifier", SqlDbType.VarChar).Value = identifier;
                command.Parameters.Add("@Password", SqlDbType.VarChar).Value = password;
                command.CommandText = "SELECT * FROM tb_agent WHERE Identifiant=@Identifier AND Motdepasse=@Password";
     
                try
                {
                    connection.Open();
                    return (command.ExecuteScalar() != null);
                }
                catch (Exception ex)
                {
                    if (ex is InvalidOperationException || ex is SqlException)
                    {
                        return false;
                    }
     
                    throw;
                }
            }
        }
    }
    Et tu l'appelle de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    const String connectionString = "SERVER=localhost; DATABASE=travellocked; UID=root; PASSWORD=";
     
    private void Button_Home_Connection_Click(object sender, EventArgs e)
    {
        if (CheckStatus(TextBox_Home_ID.Text, TextBox_Home_ID.Text))
        {
            MessageBox.Show("CONNEXION REUSSIE");
        }
        else
        {
            MessageBox.Show("Connexion échouée");
        }
    }

  12. #12
    Membre régulier
    Homme Profil pro
    BAC +3
    Inscrit en
    Octobre 2018
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : BAC +3

    Informations forums :
    Inscription : Octobre 2018
    Messages : 164
    Points : 92
    Points
    92
    Par défaut
    Ha oui d'accord ok c'est vrai que ducoup j'ouvre et ferme sans cesse ...

    Merci pour le coup de main et le code !!

    Quand tu parle de sécurité c'est en rapport au injection SQL au aucun rapport ? (Curiosité)

  13. #13
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 670
    Points : 5 242
    Points
    5 242
    Par défaut
    C'est en effet pour éviter les injections SQL.

    Par contre, question sécurité, le stockage des mots de passe en clairs dans la base, c'est la faille par excellence.
    On peut l'amoindrir avec peu de code, simplement en stockant un mot de passe Hashé...

    Le principe, l'utilisateur s'inscrit et n'a pas donc pas encore de mot de passe, tu lui en demande un et tu prévois une autre zone pour la confirmation, pour vérifier les fautes de frappes.
    Une fois que tu as vérifié que les deux mots de passes sont identiques, tu le Hash avec n'importe quelle méthode moderne genre Sha512 et c'est ce mot de passe hashé que tu stockes en base.
    Tu peux également hasher le login pour encore plus de sécurité.

    Lorsque l'utilisateur se reconnecte, il saisit son login et son mot de passe.
    Tu fait le hash de la même façon et tu compare avec le contenu en base.

    L'avantage du Hash est que c'est facile à faire et que tu n'a aucun moyen de retrouver la valeur d'origine.

  14. #14
    Membre régulier
    Homme Profil pro
    BAC +3
    Inscrit en
    Octobre 2018
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : BAC +3

    Informations forums :
    Inscription : Octobre 2018
    Messages : 164
    Points : 92
    Points
    92
    Par défaut
    Ok super merci pour toutes les précisions je vais faire ça de suite merci beaucoup

  15. #15
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    De préférence un hash avec un sel, ça permet entre autre d'éviter que deux utilisateurs qui ont le même mot de passes le stockent de la même façon.

  16. #16
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 670
    Points : 5 242
    Points
    5 242
    Par défaut
    Citation Envoyé par Noxen Voir le message
    De préférence un hash avec un sel, ça permet entre autre d'éviter que deux utilisateurs qui ont le même mot de passes le stockent de la même façon.
    Je ne connaissais pas et du coup, je suis allé faire une petite recherche.
    J'ai trouvé ce site explicatif :
    http://mieuxcoder.com/2007/12/23/met...mots-de-passe/

    Effectivement, c'est un plus non négligeable.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD22] Retour de requête SQL tronquée en production
    Par GuillaumeN dans le forum WinDev
    Réponses: 8
    Dernier message: 04/09/2017, 09h00
  2. Problème de retour de requête SQL
    Par Kira77 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/02/2014, 09h50
  3. Requête SQL avec lien hypertext en retour ?
    Par nono99 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 24/06/2010, 14h31
  4. WebMethod et retour dynamique de requête SQL
    Par Zalathorn dans le forum Services Web
    Réponses: 0
    Dernier message: 29/05/2009, 18h03
  5. afficher texte avec retour chariot aprèq requète sql
    Par frenchy371 dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/01/2004, 17h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo