1. #1
    Membre actif Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    mai 2002
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : mai 2002
    Messages : 142
    Points : 265
    Points
    265

    Par défaut SQLite - problème de commande et de paramètres

    Bonjour a tous,

    Je me casse la tète a essayer de comprendre pourquoi le code ci-dessous génère une exception:
    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
            public static List<string> ReadColumnsName(string table)
            {
                // note: par exemple, table = "material"
                var result = new List<string>();
                try
                {
                    using (SQLiteConnection con = new SQLiteConnection(SessionData.Instance.ConnectionString, true))
                    using (SQLiteCommand cmd = new SQLiteCommand(con))
                    {
                        cmd.CommandType = System.Data.CommandType.Text;
                        cmd.CommandText = SQLiteQueries.Query_ReadColumnsNames;    //SQLiteQueries.Query_ReadColumnsNames = @"PRAGMA table_info(@table)";
                        cmd.Parameters.Add(new SQLiteParameter("@table", table));
     
                        // pour esayer de debugger, affichage de la query complete dans la console.
                        string query = cmd.CommandText;
                        foreach (SQLiteParameter p in cmd.Parameters) query = query.Replace(p.ParameterName, p.Value.ToString());
                        Console.WriteLine(query); 
                        // output : PRAGMA table_info(material)
     
                        con.Open();
     
                        // la ligne suivante genere un SQLiteException : SQLite error (1): near "@table": syntax error
                        using (SQLiteDataReader rdr = cmd.ExecuteReader())
                        {
                            while (rdr.Read())
                            {
                                result.Add(rdr.GetString(rdr.GetOrdinal("name")));
                            }
                        }
                        con.Close();
                    }
                }
                catch (Exception)
                {
                    return null;
                }
                return result;
            }
    Donc... Ce code est sensé aller lire le nom des colonnes de la table passée en paramètre.
    J'instancie la connexion, j'instancie la commande, je lui passe une string, je lui passe le paramètre qui va bien.

    Si je remplace la requête par un "select * from @table", j'ai la même erreur.
    Si je change @table par @pouet (on ne sait jamais, après tout, table est un mot réservé pour SQLite), pareil, SQLite error (1): near "@pouet": syntax error.
    Si je force la commande ( en enlevant le paramètre) en écrivant SQLiteQueries.Query_ReadColumnsNames = @"PRAGMA table_info(material)";, cela marche très bien.
    Si j’exécute la même requête SQL dans un outil externe, genre DB Browser fr SQLite, cela marche très bien.

    Je ne comprends vraiment pas pourquoi l'utilisation du paramètre provoque cette erreur.
    Si quelqu'un peut m’éclairer, merci de me pointer mon erreur.
    " Entre le Savoir et le Pouvoir, il y a le Vouloir "

    Desole pour les accents, je suis en QWERTY...

  2. #2
    Membre actif Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    mai 2002
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : mai 2002
    Messages : 142
    Points : 265
    Points
    265

    Par défaut

    Bon, bien entendu, j'ai cherche avant de poster, j'ai passe du temps a ecrire ma question, je la poste.
    Je vais prendre un cafe, je regoogle un coup en changeant un peu les mots clef.
    Et la, je trouve un article sur stackoverflow:

    Typically statements like that are only possible when you use parameters that relate to actual formal parameters in the underlying query i.e:

    UPDATE candy SET name=@new_name WHERE name=@old_name;
    The idea being that all database objects like table and field names must be stated implicitly in the statement, so that the underlying database access library can perform checks along the lines of "is the value given for candy.name of the correct type".

    In your example the field name is not known in advance and so these types of checks are not possible.

    Some more info here.

    If the field name is variable, you can just build a string containing the SQL and execute it directly, or adjust what you have to include the field name in the command text.
    Donc mon problème venait de ma méconnaissance des mécanismes sous-jacents des commandes paramétrées...

    Résolu en remplaçant :
    cmd.CommandText = SQLiteQueries.Query_ReadColumnsNames;.
    par
    cmd.CommandText = SQLiteQueries.Query_ReadColumnsNames.Replace("@table", table);.

    (vu que la variable table provient d'une autre méthode, et qu'il n'y a pas d'input utilisateur, je vais m'en contenter...)
    " Entre le Savoir et le Pouvoir, il y a le Vouloir "

    Desole pour les accents, je suis en QWERTY...

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

Discussions similaires

  1. problème plantage commande sqlite suivant le mode de lancement
    Par jelowi dans le forum Général Python
    Réponses: 4
    Dernier message: 22/01/2011, 18h30
  2. [DATA] Problème exécution commande "X" paramétrée
    Par Filippo dans le forum SAS Base
    Réponses: 9
    Dernier message: 27/01/2010, 10h30
  3. Commande dos avec paramètres à partir d'excel
    Par tieumss dans le forum Access
    Réponses: 4
    Dernier message: 19/09/2006, 12h23
  4. Problème de ciblage avec un paramètre...
    Par Tchupacabra dans le forum Access
    Réponses: 7
    Dernier message: 27/12/2005, 11h55
  5. Problème de fstream passé en paramètre
    Par Beb8 dans le forum SL & STL
    Réponses: 2
    Dernier message: 11/04/2005, 12h51

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