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

Accès aux données Discussion :

[ADO.NET][Postgresql]Comment interpréter caractères spéciaux ds une requête?


Sujet :

Accès aux données

  1. #1
    spi
    spi est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 24
    Par défaut [ADO.NET][Postgresql]Comment interpréter caractères spéciaux ds une requête?
    Bonjour,

    J'ai des problèmes avec ma base de données Postgresql en utilisation avec DotNet.
    Les chaines de caractère contenant des caractères spéciaux, notamment les anti slashes, sont interprétées.
    Exemple : "\\serveur\temp" est inséré comme suit dans la base "\serveur emp", le \t est transformé en tabulation et le \\ est transforlé en slash simple.
    Ces erreurs arrivent lors de l'utilisation de Postgresql en utilisant les classes de connection directement (pas de dataset, ni datasource, utilisation des classes NpgsqlConnection et OdbcConnection).
    Ja'i essayé en me connectant avec les drivers ODBC et Npgsql, le résultat est le même.
    OR en utilisant ce meme mode de fonctionnement mais en me basant sur une base Oracle (avec le driver Oracle), ce problème ne survient pas.

    De plus, en débuggant, j'ai vu que mon instruction SQL était blindée contre ce genre d'erreur (anti slashs rajoutés automatiquement aux bons endroits), j'ai justement testé cette requete générée dans pgadmin, et ca marche très bien.

    Donc, les anti slashs de "prévention" sont zappés entre le moment ou ma requete est lancée, et entre le moment ou postgres la recoit. Ce qui est bizarre, c'est que j'ai cette erreur avec les 2 drivers différents

    Que faire ?

    edit : désolu pour les abréviations dans le titre, mais sinon , je ne pouvais pas marquer "résolu"

  2. #2
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    As-tu pensé à doublez tous ces caractères \ dans une url par exemple

  3. #3
    spi
    spi est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 24
    Par défaut
    Quand je débuggue, je vois que ma requete est bien doublée d'anti slashes automatiquement.
    De plus, Oracle le prend très bien lui, et si je double les caractères manuellement, ils seront alors doublés dans la base si j'utilise Oracle.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 98
    Par défaut
    ton but est donc d'obtenir un même résultat quelque soit le SGBD c'est ça ?
    Dans ce cas ton post m'intéresse, à moins que la réponse ne soit posté, je me penche sur ton problème après le WE.

  5. #5
    spi
    spi est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 24
    Par défaut
    Effectivement mon appli doit fonctionner au minimum avec DB2, Oracle et Postgresql, pour l'instant ca marche bien pour Oracle et Postgres (pas encore testé DB2), mais j'ai ce problème qui reste.

    La j'essaye avec des prepared statements, et je vous tiens au courant.

    J'ai testé avec les prepared statements, et ca fonctionne sous Oracle et Postgres.

    Donc au lieu de :
    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
     
    IDbConnection conn = DbUtilities.GetDbConnection();
    if (conn.State != ConnectionState.Open)
        conn.Open();
    IDbCommand cmd = conn.CreateCommand();
    cmd.CommandText = "UPDATE " + TABLE_NAME + " SET " +
                                    FIELD_NAME + " = '" + name + "', " +
                                    FIELD_ADDRESS + " = '" + address + "', " +
                                    FIELD_TYPE + " = " + type + ", " +
                                    FIELD_USER + " = '" + ftpUser + "', " +
                                    FIELD_PASSWORD + " = '" + ftpPassword + "' " +
                                  "WHERE " + FIELD_ID + "=" + id;
    cmd.ExecuteNonQuery();
    cmd.Dispose();
    conn.Close();
    conn.Dispose();
    conn = null;
    Il faut faire :
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    IDbConnection conn = DbUtilities.GetDbConnection();
    if (conn.State != ConnectionState.Open)
        conn.Open();
    IDbCommand cmd = conn.CreateCommand();
    cmd.CommandText = "UPDATE " + TABLE_NAME + " SET " +
                                    FIELD_NAME + " = :" + FIELD_NAME + ", " +
                                    FIELD_ADDRESS + " = :" + FIELD_ADDRESS + ", " +
                                    FIELD_TYPE + " = :" + FIELD_TYPE + ", " +
                                    FIELD_USER + " = :" + FIELD_USER + ", " +
                                    FIELD_PASSWORD + " = :" + FIELD_PASSWORD + " " +
                                  "WHERE " + FIELD_ID + " = :" + FIELD_ID;
     
     
    IDbDataParameter p1 = cmd.CreateParameter();
    p1.DbType = DbType.String;
    p1.Direction = ParameterDirection.Input;
    p1.ParameterName = FIELD_NAME;
    cmd.Parameters.Add(p1);
     
    IDbDataParameter p2 = cmd.CreateParameter();
    p2.DbType = DbType.String;
    p2.Direction = ParameterDirection.Input;
    p2.ParameterName = FIELD_ADDRESS;
    cmd.Parameters.Add(p2);
     
    IDbDataParameter p3 = cmd.CreateParameter();
    p3.DbType = DbType.Int32;
    p3.Direction = ParameterDirection.Input;
    p3.ParameterName = FIELD_TYPE;
    cmd.Parameters.Add(p3);
     
    IDbDataParameter p4 = cmd.CreateParameter();
    p4.DbType = DbType.String;
    p4.Direction = ParameterDirection.Input;
    p4.ParameterName = FIELD_USER;
    cmd.Parameters.Add(p4);
     
    IDbDataParameter p5 = cmd.CreateParameter();
    p5.DbType = DbType.String;
    p5.Direction = ParameterDirection.Input;
    p5.ParameterName = FIELD_PASSWORD;
    cmd.Parameters.Add(p5);
     
    IDbDataParameter p6 = cmd.CreateParameter();
    p6.DbType = DbType.Int32;
    p6.Direction = ParameterDirection.Input;
    p6.ParameterName = FIELD_ID;
    cmd.Parameters.Add(p6);
     
    cmd.Prepare();
     
    ((IDataParameter)cmd.Parameters[FIELD_NAME]).Value = this.name;
    ((IDataParameter)cmd.Parameters[FIELD_ADDRESS]).Value = this.address;
    ((IDataParameter)cmd.Parameters[FIELD_TYPE]).Value = this.type;
    ((IDataParameter)cmd.Parameters[FIELD_USER]).Value = this.ftpUser;
    ((IDataParameter)cmd.Parameters[FIELD_PASSWORD]).Value = this.ftpPassword;
    ((IDataParameter)cmd.Parameters[FIELD_ID]).Value = this.id;
     
    cmd.ExecuteNonQuery();
    cmd.Dispose();
    conn.Close();
    conn.Dispose();
    conn = null;
    Par contre, c'est un peu plus long ...

    edit : Pour postgresql, ca fonctionne bien avec Npgsql, mais pas avec le pilote Odbc.
    Erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ERROR [42601] Error while executing the query;
    ERROR:  syntax error at or near ":" at character 26

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

Discussions similaires

  1. [ADO.Net][C#] Comment utiliser Mysql ?
    Par soltani.slim dans le forum Accès aux données
    Réponses: 13
    Dernier message: 31/08/2006, 12h57
  2. [ADO.NET][C#]Comment forcer Fill correct de DataSet typé ?
    Par Manralf dans le forum Accès aux données
    Réponses: 23
    Dernier message: 21/02/2006, 09h50
  3. [ADO.Net][C#] Comment récupérer 1 valeur du BindingContext ?
    Par yann_DZ dans le forum Accès aux données
    Réponses: 2
    Dernier message: 24/01/2006, 21h56
  4. [ADO.Net][C#] Comment récupérer des infos d'une table SQL ?
    Par lamojuli dans le forum Accès aux données
    Réponses: 2
    Dernier message: 11/01/2006, 16h00
  5. Réponses: 2
    Dernier message: 26/10/2005, 11h44

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