none
Virgule et Requêtes ODBC RRS feed

  • Question

  • Bonjour,

    Malgré la lecture de plusieurs liens divers ( http://msdn.microsoft.com/fr-fr/library/system.data.odbc.odbcparameter.aspx ; http://www.csharpfr.com/forum/sujet-PB-REQUETES-SQL-PARAMETREES-ACCESS-ODBC_1049357.aspx ...) je n'arrive pas à utiliser les "requête paramétrée" sous C#, afin de passer un nombre à virgule. En effet, la base access en question n'accepte pas les points.

    Bout de code :

    OdbcCommand requete;
    
    
    
      OdbcConnection ctnAccess;
    
    
    
      OdbcDataReader lecteur;
    
    
    
    
    
    
    
      ctnAccess = new OdbcConnection();
    
    
    
      ctnAccess.ConnectionString = "Driver={Microsoft Access Driver (*.mdb)};Dbq=" + base_access;
    
    
    
      requete = new OdbcCommand();
    
    
    
    
    
    
    
      requete.Connection = ctnAccess;
    
    
    
    
    
    
    
      ctnAccess.Open();
    
    
    
     requete.CommandText = ("INSERT INTO EnteteDevis (Code,TVA) VALUES ('"
    
    
    
       //Code,TVA
    
    
    
       + "'nb_code_max','@tva')");
    
    
    
       
    
    
    
       requete.Parameters.AddWithValue("@tva", "19,6");
    
    
    
    
    
    
    
       lecteur = requete.ExecuteReader();
    
    
    
    ctnAccess.Close()
    
    
    
    

    Et rien à faire, il m'insere toujours '@tva' au lieu de 19,6.

    Je suis aussi preneur d'une méthode éventuelle qui permet facilement d'insérer directement des nombres à virgules autre que les requêtes paramétrée.

    Merci d'avance...

    vendredi 7 mai 2010 09:54

Réponses

  • Bonjour,

    "'nb_code_max',?)");

    Cordialement


    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    • Marqué comme réponse lansing-2009 vendredi 7 mai 2010 14:14
    vendredi 7 mai 2010 13:08
    Modérateur
  • Il s'agit d'une base access hélas ... je vais regarder la syntaxe de OleDB, en esperant qu'il ne faut pas tout changer par rapport à ODBC.

     

    //edit

    C'est bon et ça marche, j'ai même un message d'erreur en français pour changer : "le champ est trop petit pour accepter la quantité de données que vous voulez ajouter. Essayer d'insérer ou de coller moins de données" Plus qu'à trouver lequel des 90 champs...

    lundi 17 mai 2010 08:31

Toutes les réponses

  • Bonjour,

    Remplacez votre paramètre "@tva" par "?" dans votre requête.

    Cordialement


    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    vendredi 7 mai 2010 12:18
    Modérateur
  • Avec

    "'nb_code_max','?')");
    

    Ou

    "'nb_code_max',?)");
    

    Il me met des ? dans la requete (et plante donc logiquement après)

     

     

     

    vendredi 7 mai 2010 12:58
  • Bonjour,

    "'nb_code_max',?)");

    Cordialement


    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    • Marqué comme réponse lansing-2009 vendredi 7 mai 2010 14:14
    vendredi 7 mai 2010 13:08
    Modérateur
  • Bonjour,

    Essayez sinon : "'nb_code_max', @tva)");

    Cordialement


    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    vendredi 7 mai 2010 13:09
    Modérateur
  • Pareil, il m'insère @tva dans la requete finale, sans remplaçer la valeur...

    //Edit : ne marche pas non plus avec "'nb_code_max', ?tva)"); ni avec des [] dans INSERT INTO EnteteDevis (Code,[TVA])

     

     

    vendredi 7 mai 2010 13:19
  • Bonjour,

    Pouvez-vous m'envoyer un projet qui reproduit votre problème sur gilles.tourreau@pos.fr. Merci de mettre l'URL de cette conversation dans l'e-mail.

    Cordialement


    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    vendredi 7 mai 2010 13:38
    Modérateur
  • Bon...

    En fait cela marchait avec :

    requete.CommandText = ("INSERT INTO EnteteDevis (Code,TVA1,TVA2) VALUES ('10KA9553',?,?)");
    
     requete.Parameters.AddWithValue("?tva", "5,5");
     requete.Parameters.AddWithValue("?tva", "19,6");

    Sauf que cela n'apparaissait pas dans la requête elle même mais directement dans la base de donnés *dépité*.

    Il va falloir maintenant exploiter tout ça sans faire de code trop moche vu que j'ai 4-5 "?" à faire parmis 30 colonnes "normales" du genre

     requete.CommandText = ("INSERT INTO EnteteDevis (Code,TVA1,TVA2,texte,chiffre) VALUES ('10KA9553',?,?,'blablbalbl',?)");

       requete.Parameters.AddWithValue("?tva1", "5,5");
       requete.Parameters.AddWithValue("?tva2", "19,6");
      requete.Parameters.AddWithValue("?chiffres", "1234,5");
     

    vendredi 7 mai 2010 14:14
  • Bonjour,

    Pour information : Access ne supporte pas les paramètres "nommées" dans les requêtes (contraire à SQL Server avec l'arobase). Il faut donc mettre un point d'interrogation pour chaque paramètres. Les paramètres sont ensuite remplacés dans l'ordre dont vous les définissez via la méthode AddWithValue().

    Cordialement


    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    vendredi 7 mai 2010 14:29
    Modérateur
  • Bonjour,

     

    J’ai essayé avec ce code et il marche pour moi :

     

                OdbcCommand com;

                OdbcDataReader dr;

                OdbcConnection con;

     

                OdbcDataAdapter da = new OdbcDataAdapter();

     

     

                con = new OdbcConnection();

                con.ConnectionString = @"Dsn=MS Access Database;dbq=C:\ALEX\PROGRAMMING\Database1.accdb;defaultdir=C:\ALEX\PROGRAMMING;driverid=25;fil=MS Access;maxbuffersize=2048;pagetimeout=5;uid=admin";

     

                com = new OdbcCommand();

                com.Connection = con;

                con.Open();

     

                com.Parameters.AddWithValue("@par1", "Field1");

               

                com.Parameters["@par1"].Value = "xx";

               

                com.CommandText = "insert into Table1 (Field1, Field2) values ('c',?)";

               

                dr = com.ExecuteReader();

     

     

     

    Essayez de mètre la valeur du paramètre dans la proprieté Value :

    com.Parameters.Value = "xx" ;

    Cordialement,

    Alex


    Appel à contribution ! http://social.msdn.microsoft.com/Forums/fr-FR/vbasicfr/thread/bd974e0e-5519-4122-b8fc-3b998207c34f
    vendredi 7 mai 2010 14:35
  • Bon, comme indiqué le problème est résolu mais à la suite de cela, je suis tombé sur des cas d'erreur avec des exeptions

    "{"ERROR [HY090] [Microsoft][Pilote ODBC Microsoft Access]Longueur de chaîne ou de mémoire tampon non valide "}"

    Afin que je trouve le pourquoi du comment, comment faire

    - pour générer la requête tel qu'elle sera executée dans la BDD, à savoir récuprer le commandetexte et les "?" remplacés par les paramêtres. Je peux le faire à la main mais avec 90 paramêtres, c'est un peu long

    - le peu de chose que j'ai trouvé parle de http://msdn.microsoft.com/fr-fr/library/ms131690.aspx je ne sais pas encore si c'est ça ou pas (requête trop longue ?)

    mercredi 12 mai 2010 15:16
  • Bonjour,

    Ce problème ODBC peut venir de plusieurs causes : http://www.easysoft.com/developer/interfaces/odbc/sqlstate_status_return_codes.html#HY090

    N'avez-vous pas la possibilité d'utiliser OleDB au lieu d'ODBC ? Au mieux, utiliser SQL Server ?

    Cordialement


    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    jeudi 13 mai 2010 18:10
    Modérateur
  • Il s'agit d'une base access hélas ... je vais regarder la syntaxe de OleDB, en esperant qu'il ne faut pas tout changer par rapport à ODBC.

     

    //edit

    C'est bon et ça marche, j'ai même un message d'erreur en français pour changer : "le champ est trop petit pour accepter la quantité de données que vous voulez ajouter. Essayer d'insérer ou de coller moins de données" Plus qu'à trouver lequel des 90 champs...

    lundi 17 mai 2010 08:31