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 :

csharp requete mysql paramétrée


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur DELPHI
    Inscrit en
    Février 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Développeur DELPHI
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2011
    Messages : 26
    Par défaut csharp requete mysql paramétrée
    Bonjour à tous,

    Je cherche à créer une requête MySql en passent mes informations de recherche à l'aide de paramètres.

    Le problème c'est que tous les exemples trouvés traite sur des INSERT

    Donc première question, est-il possible d'utiliser un SELECT avec une requête paramétrée ?

    Et si oui, m'expliquer comme m'y prendre.

    Ci-dessous un bout de code sur lequel je m'arrache les cheveux

    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using MySql.Data.MySqlClient;
    using System.Data;
     
    // Déclaration du DataSet
    ds = new DataSet();
     
    // Initialisation de la connexion à la base de données.
    MySqlConnection conn = new MySqlConnection("Data Source='127.0.0.1' ;Database='mabase' ;user id='mon_user' ;Password='mon_password'");
    MySqlCommand MyCmd = new MySqlCommand();
     
    string _reqSQL = "SELECT mon_champ1, mon_champ2 ,mon_champ3 " +
                     "FROM ma_table WHERE mon_champ3 like @nom_parametre GROUP BY mon_champ3";
     
    MyCmd.Parameters.AddWithValue("@nom_parametre", "toto");
    MyCmd.CommandText = _reqSQL;
    MySqlDataAdapter ReqExecut = new MySqlDataAdapter(_reqSQL, conn);
     
    conn.Open();
     
    ReqExecut.Fill(ds);
     
    conn.Close();
    Seul petit problème, c'est que ça ne fonctionne pas.

    Ci-dessous l'erreur remontée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    InnerException: MySql.Data.MySqlClient.MySqlException
           Message="Parameter '@nom_parametre' must be defined."
           Source="MySql.Data"
           ErrorCode=-2147467259
           Number=0
           StackTrace:
    Je vous remercie par avance de votre aide

    Cordialement

    Frank

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    Bonjour, je ne vois pas vraiment ce qui peut poser problème, peut être le fait que tu n'ai pas entouré ton paramètre de parenthèses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string _reqSQL = "SELECT mon_champ1, mon_champ2 ,mon_champ3 " +
                     "FROM ma_table WHERE mon_champ3 like(@nom_parametre) GROUP BY mon_champ1, mon_champ2 ,mon_champ3";
    De plus il faut répéter tous les champs du select dans le group by (sauf fonctions)

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ton code semble correct pourtant...

    Essaie 2 choses :
    - Définir le CommandText avant d'ajouter le paramètre (au cas où le fait de définir CommandText viderait la liste des paramètres, ce qui ne m'étonnerait pas complètement)
    - Enlever le "@" dans l'appel à AddWithValue ; avec certains providers ils faut le mettre, et avec d'autres il faut pas... pour MySQL je sais plus

  4. #4
    Membre averti
    Homme Profil pro
    Développeur DELPHI
    Inscrit en
    Février 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Développeur DELPHI
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2011
    Messages : 26
    Par défaut
    Citation Envoyé par asmduty Voir le message
    Bonjour, je ne vois pas vraiment ce qui peut poser problème, peut être le fait que tu n'ai pas entouré ton paramètre de parenthèses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string _reqSQL = "SELECT mon_champ1, mon_champ2 ,mon_champ3 " +
                     "FROM ma_table WHERE mon_champ3 like(@nom_parametre) GROUP BY mon_champ1, mon_champ2 ,mon_champ3";
    De plus il faut répéter tous les champs du select dans le group by (sauf fonctions)
    J'ai effectué un essai en ajoutant les parenthèses, mais ça n'a rien changé au problème

    Citation Envoyé par tomlev Voir le message
    Ton code semble correct pourtant...

    Essaie 2 choses :
    - Définir le CommandText avant d'ajouter le paramètre (au cas où le fait de définir CommandText viderait la liste des paramètres, ce qui ne m'étonnerait pas complètement)
    - Enlever le "@" dans l'appel à AddWithValue ; avec certains providers ils faut le mettre, et avec d'autres il faut pas... pour MySQL je sais plus
    Après une multitude de recherches sur Internet, visiblement, il y a des personnes qui mette un ? d'autre un @

    J'ai également essayé d'inverser le CommandText et le paramètre, mais le problème reste entier.

    Je me pose la question si c'est pas mon DataSet qui pose problème.

    Cordialement

    Frank

  5. #5
    Membre averti
    Homme Profil pro
    Développeur DELPHI
    Inscrit en
    Février 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Développeur DELPHI
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2011
    Messages : 26
    Par défaut
    Bon, visiblement, ce n'est pas le DataSet qui pose problème.

    Si j'exécute la requête sans passer par un paramètre, ça fonctionne.

    Donc je dois oublier quelque chose lors de la déclaration du paramètre. Mais quoi ???

    Cordialement

    Frank

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    Pour les "?" ou les "@variable", celà dépend des providers
    Avec ODBC je mettais de "?", avec le provider DB2 je met des "@variable"
    Dans le premier cas les paramètres sont pris dans l'ordre, dans le second il faut que tu ai le même nombre de paramètres et que les noms correspondent.
    Je n'ai pas utilisé mySql; mais de mon côté moi j'ajoute les paramètres comme ça avec le provider DB2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MySqlCommand.parameters.add(new mysqlparameter("@nom_parametre", "valeur"))
    C'est peut être sensé faire la même chose mais parfois ...

  7. #7
    Membre averti
    Homme Profil pro
    Développeur DELPHI
    Inscrit en
    Février 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Développeur DELPHI
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2011
    Messages : 26
    Par défaut
    Bonjour asmduty,

    En gros, ça devrait donner le résultat ci-dessous ?

    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
     
    // Déclaration du DataSet
    ds = new DataSet();
     
    // Initialisation de la connexion à la base de données.
    MySqlConnection conn = new MySqlConnection("Data Source='127.0.0.1' ;Database='mabase' ;user id='mon_user' ;Password='mon_password'");
    MySqlCommand MyCmd = new MySqlCommand();
     
    string _reqSQL = "SELECT mon_champ1, mon_champ2 ,mon_champ3 " +
                     "FROM ma_table WHERE mon_champ3 like @nom_parametre GROUP BY mon_champ3";
     
    MyCmd.Parameters.Add(new MySqlParameter("@nom_parametre", "toto"));
    MyCmd.CommandText = _reqSQL;
    MySqlDataAdapter ReqExecut = new MySqlDataAdapter(_reqSQL, conn);
     
    conn.Open();
     
    ReqExecut.Fill(ds);
     
    conn.Close();
    Si tel est le cas, ça ne fonctionne pas

    Ci-dessous le message d'erreur :

    L'exception MySql.Data.MySqlClient.MySqlException n'a pas été gérée
    Message="Fatal error encountered during command execution."
    Source="MySql.Data"
    ErrorCode=-2147467259
    Number=0
    StackTrace:
    à MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
    à MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
    à System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
    à System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
    à System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
    à System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
    à MySQL_Csharp.ClassSQL.Load_List(String _search, DataSet& ds)
    à MySQL_Csharp.Form1.button1_Click(Object sender, EventArgs e)
    à System.Windows.Forms.Control.OnClick(EventArgs e)
    à System.Windows.Forms.Button.OnClick(EventArgs e)
    à System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
    à System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
    à System.Windows.Forms.Control.WndProc(Message& m)
    à System.Windows.Forms.ButtonBase.WndProc(Message& m)
    à System.Windows.Forms.Button.WndProc(Message& m)
    à System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    à System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    à System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    à System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
    à System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
    à System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    à System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    à System.Windows.Forms.Application.Run(Form mainForm)
    à MySQL_Csharp.Program.Main()
    à System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
    à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
    à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
    à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    à System.Threading.ThreadHelper.ThreadStart()
    InnerException: MySql.Data.MySqlClient.MySqlException
    Message="Parameter '@nom_parametre' must be defined."
    Source="MySql.Data"
    ErrorCode=-2147467259
    Number=0
    StackTrace:
    à MySql.Data.MySqlClient.Statement.SerializeParameter(MySqlParameterCollection parameters, MySqlPacket packet, String parmName)
    à MySql.Data.MySqlClient.Statement.InternalBindParameters(String sql, MySqlParameterCollection parameters, MySqlPacket packet)
    à MySql.Data.MySqlClient.Statement.BindParameters()
    à MySql.Data.MySqlClient.Statement.Execute()
    à MySql.Data.MySqlClient.PreparableStatement.Execute()
    à MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
    InnerException:

  8. #8
    Membre très actif Avatar de miripesage
    Homme Profil pro
    gerant
    Inscrit en
    Novembre 2009
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : gerant
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2009
    Messages : 725
    Par défaut
    Bonjour, je ne connais pas C#, mais à mon avis, vous aurez dû déclarer nom_parametre avant comme ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String nom_parametre  = "toto";

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par miripesage Voir le message
    Bonjour, je ne connais pas C#, mais à mon avis, vous aurez dû déclarer nom_parametre avant comme ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String nom_parametre  = "toto";
    Effectivement, tu ne connais visiblemement pas C#
    Dans le code de frank569, "nom_parametre" est une chaine de caractères, pas une variable...

  10. #10
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Essaie d'utiliser simplement ? à la place de @parametre.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  11. #11
    Membre confirmé
    Inscrit en
    Novembre 2010
    Messages
    176
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 176
    Par défaut
    bonsoir. je suis sur le même navire que frank569 ....
    je me prends la tête depuis plusieurs heures et je n'ai pas encore trouvé de solutions sur internet.

    dans mon cas, je souhaite créer des dizaines de tables identiques de manière programmatique.

    le nom des tables serait contenu dans une une array et je comptais faire une boucle sur une Mysqlcommand.CommandText ou quelque chose de la sorte.

    çà pourrait être comme suit :

    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
    34
    35
     
    namespace Connection
    {
        class Program
        {
            static void Main(string[] args)
            {
               string cs = "server=localhost;user=admin;" +
               "database=test;port=3306;password=admin";
     
                try
                {
                    Console.WriteLine("Connecting to MySQL...");
                    MySqlConnection conn = new MySqlConnection(cs);
                    conn.Open();
                    string [] stationname = {"stationBC21", "stationsDW98, ... , etc};
                    MySqlCommand cmd = new MySqlCommand();
                    Console.WriteLine("md.commandtext ...");
                    cmd.CommandText = @"(CREATE TABLE IF NOT EXISTS @stationName = (`STN` int(6) NOT NULL,
                    `WBAN` int(5) NOT NULL,
                    `YEARMODA` int(8) NOT NULL,
                    `TEMP` double(4,1) NOT NULL,
                    ) ENGINE=InnoDB DEFAULT CHARSET=latin1)";
     
                    Console.WriteLine("cmd.parameters,add ...");
                    cmd.Parameters.AddWithValue("@stationName", stationname);
                }
     
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
        }
    }
    .... mais bon, çà ne crée rien du tout.

    si quelqu'un à des pistes pour créer des tables de manière programmatique à partir de C# ... je suis preneur.

    merci

  12. #12
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    Citation Envoyé par tallent_e Voir le message
    bonsoir. je suis sur le même navire que frank569 ....
    je me prends la tête depuis plusieurs heures et je n'ai pas encore trouvé de solutions sur internet.

    dans mon cas, je souhaite créer des dizaines de tables identiques de manière programmatique.

    le nom des tables serait contenu dans une une array et je comptais faire une boucle sur une Mysqlcommand.CommandText ou quelque chose de la sorte.

    çà pourrait être comme suit :

    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
    34
    35
     
    namespace Connection
    {
        class Program
        {
            static void Main(string[] args)
            {
               string cs = "server=localhost;user=admin;" +
               "database=test;port=3306;password=admin";
     
                try
                {
                    Console.WriteLine("Connecting to MySQL...");
                    MySqlConnection conn = new MySqlConnection(cs);
                    conn.Open();
                    string [] stationname = {"stationBC21", "stationsDW98, ... , etc};
                    MySqlCommand cmd = new MySqlCommand();
                    Console.WriteLine("md.commandtext ...");
                    cmd.CommandText = @"(CREATE TABLE IF NOT EXISTS @stationName = (`STN` int(6) NOT NULL,
                    `WBAN` int(5) NOT NULL,
                    `YEARMODA` int(8) NOT NULL,
                    `TEMP` double(4,1) NOT NULL,
                    ) ENGINE=InnoDB DEFAULT CHARSET=latin1)";
     
                    Console.WriteLine("cmd.parameters,add ...");
                    cmd.Parameters.AddWithValue("@stationName", stationname);
                }
     
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
        }
    }
    .... mais bon, çà ne crée rien du tout.

    si quelqu'un à des pistes pour créer des tables de manière programmatique à partir de C# ... je suis preneur.

    merci
    Dans ton cas je ne vois pas d'ordre d'execution de la requête

    Pour en revenir au sujet initial, selon le lien ce-dessus, la solution serait simplement le fait de commencer le nom des variables par des "?" au lieu des "@" ...

  13. #13
    Membre averti
    Homme Profil pro
    Développeur DELPHI
    Inscrit en
    Février 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Développeur DELPHI
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2011
    Messages : 26
    Par défaut
    Bonjour à tous,

    Bon, j'ai résolut mon problème.

    Je mes ci-dessous le code pour ceux qui ont le même problème que moi

    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
    34
    35
     
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using MySql.Data.MySqlClient;
    using System.Data;
     
    public void Ma_Fonction(string _search, out IList<string> _maListe)
    {
    	_maListe = new List<string>();
     
    	// Initialisation de la connexion à la base de données.
    	MySqlConnection conn = new MySqlConnection("Data Source='127.0.0.1' ;Database='mabase' ;user id='mon_user' ;Password='mon_password'");
     
    	string _reqSQL = "SELECT mon_champ1, mon_champ2 ,mon_champ3 " +
    					 "FROM ma_table WHERE mon_champ3 like @nom_parametre GROUP BY mon_champ1, mon_champ2 ,mon_champ3";
     
    	MySqlCommand MyCmd = new MySqlCommand(_reqSQL, conn);
    	MyCmd.Parameters.AddWithValue("@nom_parametre",_search);
     
    	MySqlDataReader myReader = null;
     
    	conn.Open();
    	myReader = MyCmd.ExecuteReader();
     
    	while (myReader.Read())
    	{
    		_maListe.Add(myReader["mon_champ3"].ToString());
    	}
     
    	myReader.Close();
    	conn.Close();
    }
    Dans mon exemple, je passe par une fonction et j'utilise une liste pour récupérer les informations de mon Reader.
    D'où la déclaration "_maListe = new List<string>();"

    Pour appeler la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    private void button1_Click(object sender, EventArgs e)
    {
    	// Création du DataSet de retour
    	List<string> _maListe;
    	// Appelle de la fonction pour remplir le DataSet.
    	Ma_Fonction(textBox1.Text, out _maListe);
    	// Remplissage du combobox
    	comboBox1.DataSource = _maListe;
     
    }
    Voilou en espère que ça aidera d'autres personnes

    Cordialement

    Frank

  14. #14
    Membre très actif Avatar de miripesage
    Homme Profil pro
    gerant
    Inscrit en
    Novembre 2009
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : gerant
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2009
    Messages : 725
    Par défaut
    Rebonjour, dans ce cas je corrige mon code :

    Citation Envoyé par frank569 Voir le message
    Bonjour à tous,

    Je cherche à créer une requête MySql en passent mes informations de recherche à l'aide de paramètres.

    Le problème c'est que tous les exemples trouvés traite sur des INSERT

    Donc première question, est-il possible d'utiliser un SELECT avec une requête paramétrée ?

    Et si oui, m'expliquer comme m'y prendre.

    Ci-dessous un bout de code sur lequel je m'arrache les cheveux

    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
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using MySql.Data.MySqlClient;
    using System.Data;
    
    // Déclaration du DataSet
    ds = new DataSet();
    
    // Initialisation de la connexion à la base de données.
    MySqlConnection conn = new MySqlConnection("Data Source='127.0.0.1' ;Database='mabase' ;user id='mon_user' ;Password='mon_password'");
    MySqlCommand MyCmd = new MySqlCommand();
    
     MyCmd.Parameters=new MySqlParameter("@nom_parametre");   
    string _reqSQL = "SELECT mon_champ1, mon_champ2 ,mon_champ3 " +
                     "FROM ma_table WHERE mon_champ3 like @nom_parametre GROUP BY mon_champ3";
    
    MyCmd.Parameters.AddWithValue("@nom_parametre", "toto");
    MyCmd.CommandText = _reqSQL;
    MySqlDataAdapter ReqExecut = new MySqlDataAdapter(_reqSQL, conn);
    
    conn.Open();
    
    ReqExecut.Fill(ds);
    			
    conn.Close();
    Seul petit problème, c'est que ça ne fonctionne pas.

    Ci-dessous l'erreur remontée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    InnerException: MySql.Data.MySqlClient.MySqlException
           Message="Parameter '@nom_parametre' must be defined."
           Source="MySql.Data"
           ErrorCode=-2147467259
           Number=0
           StackTrace:
    Je vous remercie par avance de votre aide

    Cordialement

    Frank

  15. #15
    Membre confirmé
    Inscrit en
    Novembre 2010
    Messages
    176
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 176
    Par défaut
    @frank569
    peut-être le lien qui suit pourra-t'il t'aider
    http://cliper.boholcentral.com/post/...with-CNET.aspx

    de mon côté, je n'avance pas avec ma création de table .... purée ...

  16. #16
    Membre averti
    Homme Profil pro
    Développeur DELPHI
    Inscrit en
    Février 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Développeur DELPHI
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2011
    Messages : 26
    Par défaut
    Bonjour, je poste ci-dessous une autre méthode pour effectuer une recherche avec des requêtes paramétrées sous MySQL.

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using MySql.Data.MySqlClient;
    using System.Data;
     
    public void ma_fonction(string _nom_parametre, out DataTable dt_table)
    {
    	dt_table = new DataTable();
    	DataSet ds_rows = new DataSet();
     
    	MySqlParameter param = new MySqlParameter();
    	MySqlConnection conn = new MySqlConnection("Data Source='127.0.0.1' ;Database='mabase';port=3306 ;user id='mon_user' ;Password='mon_password'");
    	MySqlCommand MyCmd = new MySqlCommand();
    	MySqlDataAdapter sqlAdapter = new MySqlDataAdapter();
     
    	_reqMySQL = "SELECT mon_champ1, mon_champ2 ,mon_champ3 FROM ma_table WHERE mon_champ3 = @nom_parametre GROUP BY mon_champ1, mon_champ2 ,mon_champ3";
     
    	try
    	{
    		MyCmd = new MySqlCommand(_reqMySQL, conn);
    		param.ParameterName = "@nom_parametre";
    		param.MySqlDbType = MySqlDbType.VarChar;
    		param.Size = 50; // Taille du champ
    		param.Value = _nom_parametre.Replace("'", "\\'");
    		param.Direction = ParameterDirection.Input;
    		MyCmd.Parameters.Add(param);
     
    		conn.Open();
    		sqlAdapter = new MySqlDataAdapter(MyCmd);
    		sqlAdapter.Fill(ds_rows);
     
    		dt_table = ds_rows.Tables[0];
     
    	catch (Exception erreur)
    	{
    		MessageBox.Show(erreur.Message, "Erreur" + erreur.Source, MessageBoxButtons.OK, MessageBoxIcon.Error);
    	}
    	finally
    	{
    		// Fermeture de la connexion 
    		conn.Close();
    	}
    }
    Puis pour appeler la fonction à l'aide d'un bouton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     private void mon_bouton_Click(object sender, EventArgs e)
    {
    	MaClass.ma_fonction(textbox1.text, out dt_table);
     
    	foreach (DataRow ligne in dt_table.Rows)
    	{
    		// Récupération des données à insérer dans la grille
    		ListViewItem item1 = new ListViewItem(dt_table[0].ToString(), 0);
    		// Insertion des données dans la grille
    		listview1.Items.AddRange(new ListViewItem[] { item1 });
    	}
    }
    Cordialement

    Frank

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 08/06/2006, 16h53
  2. arret requete mysql
    Par titiyo dans le forum Bases de données
    Réponses: 5
    Dernier message: 15/10/2004, 17h40
  3. Problème sous requete MySQL
    Par gavelin dans le forum Langage SQL
    Réponses: 3
    Dernier message: 20/07/2004, 10h36
  4. Requete MySql pour Mambo Open source
    Par azman0101 dans le forum Requêtes
    Réponses: 2
    Dernier message: 22/06/2004, 09h34

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