Meilleur auteur de réponses
Virgule et Requêtes ODBC

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...
- Modifié lansing-2009 vendredi 7 mai 2010 12:57
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
-
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...
- Marqué comme réponse Gilles TOURREAUModerator lundi 17 mai 2010 08:54
Toutes les 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
-
-
-
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 -
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");
-
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 -
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 -
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 ?)
-
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 -
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...
- Marqué comme réponse Gilles TOURREAUModerator lundi 17 mai 2010 08:54