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

Bases de données Delphi Discussion :

Oracle et Unicode


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 8
    Par défaut Oracle et Unicode
    Bonjour,
    Je travaille sur un chantier de migration unicode. Je rencontre un souci pour les requêtes avec Oracle : les requêtes utilisant des valeurs unicode ne fonctionnent tout simplement pas. Les valeurs sont remplacées par des points d'interogations à l'envers.
    Le champs sous Oracle est bien en nvarchar2.
    J'ai tenté de mettre le préfixe N devant la valeur : nok.
    Ex : select * from service where libelle = N'會計'
    J'ai tenté de passer par des paramètres : nok.
    Ex : select * from service where libelle = Lib
    Valeur du paramètre : 會計
    J'ai tenté de typer les paramètre en ftwidestring : nok.


    Compilateur : Delphi XE3
    Composant utilisé : DbGo (AdoConnection et AdoQuery)
    Provider : OraOLEDB.Oracle.1 (version 11.2.0.1.0)

    Paramètre de la base de données :
    SELECT * FROM V$NLS_PARAMETERS

    NLS_LANGUAGE FRENCH
    NLS_TERRITORY FRANCE
    NLS_CURRENCY €
    NLS_ISO_CURRENCY FRANCE
    NLS_NUMERIC_CHARACTERS ,
    NLS_CALENDAR GREGORIAN
    NLS_DATE_FORMAT DD/MM/RR
    NLS_DATE_LANGUAGE FRENCH
    NLS_CHARACTERSET WE8MSWIN1252
    NLS_SORT FRENCH
    NLS_TIME_FORMAT HH24:MI:SSXFF
    NLS_TIMESTAMP_FORMAT DD/MM/RR HH24:MI:SSXFF
    NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR
    NLS_TIMESTAMP_TZ_FORMAT DD/MM/RR HH24:MI:SSXFF TZR
    NLS_DUAL_CURRENCY €
    NLS_NCHAR_CHARACTERSET AL16UTF16
    NLS_COMP BINARY
    NLS_LENGTH_SEMANTICS BYTE
    NLS_NCHAR_CONV_EXCP FALSE

    SELECT * FROM NLS_SESSION_PARAMETERS

    NLS_LANGUAGE FRENCH
    NLS_TERRITORY FRANCE
    NLS_CURRENCY €
    NLS_ISO_CURRENCY FRANCE
    NLS_NUMERIC_CHARACTERS ,
    NLS_CALENDAR GREGORIAN
    NLS_DATE_FORMAT DD/MM/RR
    NLS_DATE_LANGUAGE FRENCH
    NLS_SORT FRENCH
    NLS_TIME_FORMAT HH24:MI:SSXFF
    NLS_TIMESTAMP_FORMAT DD/MM/RR HH24:MI:SSXFF
    NLS_TIME_TZ_FORMAT HH24:MI:SSXFF TZR
    NLS_TIMESTAMP_TZ_FORMAT DD/MM/RR HH24:MI:SSXFF TZR
    NLS_DUAL_CURRENCY €
    NLS_COMP BINARY
    NLS_LENGTH_SEMANTICS BYTE
    NLS_NCHAR_CONV_EXCP FALSE

    Je ne comprends pas pourquoi cela ne marche pas... si quelqu'un a une piste, je suis preneur.
    Merci d'avance,

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2012
    Messages : 92
    Par défaut
    salut,

    je suis sur un sujet similaire avec des pb similaires, sauf que je vois le bout du tunnel.

    j'utilise les composants ADO. le code ci-dessous fonctionne à condition d'avoir dans le connectionstring
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    connectionstring = 'Provider=OraOLEDB.Oracle.1;password=...; NDatatype=TRUE;';
    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
    65
    66
    67
    68
    69
     
    procedure TfrmMain.Button1Click(Sender: TObject);
    var
      adoquery : TADOQuery ;
    begin
     
      adoquery := TADOQuery.Create(nil);
      try
        try
            adoquery.Connection := dmdConnect.cntMain ;
            adoquery.SQL.Add( 'insert into test_unicode ( TEINT_ID, TEINT_DES_FR, TEINT_DES_RU ) values ( 25 , ''bleu'' ,  N''XXXXX'' )' );
     
            adoquery.ExecSQL ;
     
            ShowMessage( 'Ok' );
     
        except
          on e : Exception do
            ShowMessage( e.Message );
        end;
      finally
        adoquery.Free ;
      end;
     
     
     
     
    end;
     
    procedure TfrmMain.Button2Click(Sender: TObject);
    var
      adoquery : TADOQuery ;
      psValue : string;
      iLen : integer ;
    begin
     
      adoquery := TADOQuery.Create(nil);
      try
        try
            adoquery.Connection := dmdConnect.cntMain ;
            adoquery.SQL.Add( 'insert into test_unicode ( TEINT_ID , TEINT_DES_FR, TEINT_DES_RU ) values ( :sID , :sTEINT_FR,  :sTeint_RU )' );
     
            adoquery.Parameters.Clear ;
     
            psValue := '5' ;
            adoquery.Parameters.CreateParameter(  'sID', ftInteger, pdInput, 0 , psValue ) ;
     
            psValue := 'bleu' ;
            iLen := Length(psValue) ;
            adoquery.Parameters.CreateParameter(  'sTeint_FR', ftString, pdInput, iLen , psValue ) ;
     
            psValue := XXXXX ;
            iLen := Length(psValue) ;
            adoquery.Parameters.CreateParameter(  'sTeint_RU', ftString, pdInput, iLen , psValue ) ;
     
            adoquery.ExecSQL ;
     
            ShowMessage( 'Ok' );
     
        except
          on e : Exception do
            ShowMessage( e.Message );
        end;
      finally
        adoquery.Free ;
      end;
     
     
    end;
    note : remplace les XXXXX par 'белый'

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 8
    Par défaut
    Bonjour,
    Merci pour votre réponse. Cela me permet d'arriver au même niveau que vous.

    Effectivement, l'option permet d'arriver à faire les insert et les update. Les select en revanche ne fonctionnent pas

    Et quand je lis cela, cela me fait peur...
    OraOLEDB does not support parameters of N datatypes in the WHERE clause of SQL statements

    http://docs.oracle.com/cd/B10501_01/...5498/using.htm

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2012
    Messages : 92
    Par défaut
    les selects ont fonctionné de suite par contre je n'ai pas essayé dans un filtre de recherche

    au niveau de la version du client, j'ai essayé la 10.2.0 et la 11.2.0

    Paramètre de la base de données :
    SELECT * FROM V$NLS_PARAMETERS
    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
    NLS_LANGUAGE = FRENCH
    NLS_TERRITORY = FRANCE
    NLS_CURRENCY = €
    NLS_ISO_CURRENCY = FRANCE
    NLS_NUMERIC_CHARACTERS = , 
    NLS_CALENDAR = GREGORIAN
    NLS_DATE_FORMAT = DD/MM/RR
    NLS_DATE_LANGUAGE = FRENCH
    NLS_CHARACTERSET = WE8ISO8859P15
    NLS_SORT = FRENCH
    NLS_TIME_FORMAT = HH24:MI:SSXFF
    NLS_TIMESTAMP_FORMAT = DD/MM/RR HH24:MI:SSXFF
    NLS_TIME_TZ_FORMAT = HH24:MI:SSXFF TZR
    NLS_TIMESTAMP_TZ_FORMAT = DD/MM/RR HH24:MI:SSXFF TZR
    NLS_DUAL_CURRENCY = €
    NLS_NCHAR_CHARACTERSET = AL16UTF16
    NLS_COMP = BINARY
    NLS_LENGTH_SEMANTICS = BYTE
    NLS_NCHAR_CONV_EXCP = FALSE
    SELECT * FROM NLS_SESSION_PARAMETERS
    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
    NLS_LANGUAGE = FRENCH
    NLS_TERRITORY = FRANCE
    NLS_CURRENCY = €
    NLS_ISO_CURRENCY = FRANCE
    NLS_NUMERIC_CHARACTERS = , 
    NLS_CALENDAR = GREGORIAN
    NLS_DATE_FORMAT = DD/MM/RR
    NLS_DATE_LANGUAGE = FRENCH
    NLS_SORT = FRENCH
    NLS_TIME_FORMAT = HH24:MI:SSXFF
    NLS_TIMESTAMP_FORMAT = DD/MM/RR HH24:MI:SSXFF
    NLS_TIME_TZ_FORMAT = HH24:MI:SSXFF TZR
    NLS_TIMESTAMP_TZ_FORMAT = DD/MM/RR HH24:MI:SSXFF TZR
    NLS_DUAL_CURRENCY = €
    NLS_COMP = BINARY
    NLS_LENGTH_SEMANTICS = BYTE
    NLS_NCHAR_CONV_EXCP = FALSE

    EDIT :
    1ére méthode pour le select : OK

    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
    procedure TfrmMain.Button3Click(Sender: TObject);
    var
      adoquery : TADOQuery ;
    begin
     
      adoquery := TADOQuery.Create(nil);
      try
        try
            adoquery.Connection := dmdConnect.cntMain ;
            adoquery.SQL.Add( 'select * from test_unicode where TEINT_DES_RU like N''XXXXX'' ' );
     
            adoquery.Open ;
     
            if not adoquery.Eof then
              ShowMessage( 'Ok : ' + adoquery.FieldByName ( 'TEINT_DES_RU' ).AsString )
            else
              ShowMessage( 'NOk');
     
        except
          on e : Exception do
            ShowMessage( e.Message );
        end;
      finally
        adoquery.Free ;
      end;
     
    end;
    XXXXX = %елы%

    2éme méthode : avec les paramètres : pas encore OK

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2002
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 8
    Par défaut
    J'ai refait les tests avec les select.
    Que ce soit avec le préfixe N ou les paramètres, cela ne fonctionne pas...
    On a les mêmes paramètres de session. Le champ de mon coté est typé en nvarchar2. Est-ce aussi le cas de votre coté ?

    La solution du filtre de recherche fonctionne mais pose le problème des performances . Je préférerai donc éviter.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2012
    Messages : 92
    Par défaut
    voici le script de la table. le champs est bien du NVARCHAR2

    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
    DROP TABLE TEST_UNICODE CASCADE CONSTRAINTS;
     
    CREATE TABLE TEST_UNICODE
    (
      TEINT_ID      INTEGER,
      TEINT_DES_FR  VARCHAR2(50 BYTE),
      TEINT_DES_RU  NVARCHAR2(50)
    )
    TABLESPACE HADHOC_TAB
    RESULT_CACHE (MODE DEFAULT)
    PCTUSED    0
    PCTFREE    10
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                NEXT             1M
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                PCTINCREASE      0
                BUFFER_POOL      DEFAULT
                FLASH_CACHE      DEFAULT
                CELL_FLASH_CACHE DEFAULT
               )
    LOGGING 
    NOCOMPRESS 
    NOCACHE
    NOPARALLEL
    MONITORING;

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

Discussions similaires

  1. Delphi Oracle et unicode
    Par jeffray03 dans le forum Bases de données
    Réponses: 10
    Dernier message: 08/07/2009, 16h53
  2. Réponses: 1
    Dernier message: 07/11/2006, 15h52
  3. Importer données Unicode Oracle dans SQL-Server 2000.
    Par LaFraise dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 12/12/2005, 14h54
  4. [Kylix] sqlconnection + oracle
    Par tibo55555 dans le forum EDI
    Réponses: 1
    Dernier message: 02/09/2002, 09h09
  5. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18

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