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 :

[Delphi2007]Oracle + Integer + Blob


Sujet :

Bases de données Delphi

  1. #1
    Membre averti
    Avatar de HumanTool
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2006
    Messages : 276
    Points : 378
    Points
    378
    Par défaut [Delphi2007]Oracle + Integer + Blob
    Bonjour,
    je travaille actuellement au passage à dbexpress/Oracle d'une application sous BDE/Paradox.
    J'ai donc déposé sur une fiche test :
    - un TSQLConnection
    - un TSQLQuery
    - un TDataSetProvider
    - un TClientDataSet
    - un TDataSource
    - un TDBGrid
    Le TDataSetProvider a l'option 'AllowCommandText' et mon TClientDataSet a son commandtext 'SELECT * FROM TEST'

    J'ai fait une table de test sous oracle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    NUMTEST	NUMBER(8,0)
    NOMTEST	VARCHAR2(50)
    DATETIMETEST	DATE
    DATETEST	DATE
    TIMETEST	TIMESTAMP(6)
    SMALLINTTEST	NUMBER(4,0)
    MEMOTEST	CLOB
    BLOBTEST	BLOB
    DECIMALTEST	BINARY_FLOAT
    NUMERICTEST	BINARY_DOUBLE
    Le but de cette table est de référencer tous les types utilisés dans l'application et de voir comment cela se comporte sous dbexpress.

    C'est là que je bute sur deux soucis :
    1-étant donné que oracle n'a pas de type, explicite, integer je me retrouve sous delphi avec un champ de type TFMTBCDField.
    J'aimerais pouvoir manipulé un champ TIntegerField qui me semble plus efficace...et de toute manière je n'ai pas besoin de géré des champs monétaires.

    2-Je n'arrive pas à déclarer un champ de type TBlobField dans mon clientdataset, j'ai une erreur 'ORA-01036 : numero/nom de variable interdit'

    Je ne trouve pas beaucoup de retour sur dbexpress/oracle, je sais que beaucoup partent sur ADO/Oracle ou Zeos/Oracle.....
    mais je veux quand même comprendre les tenants et aboutissants...
    D'abord ils vous ignorent, ensuite ils se moquent de vous, puis ils vous combattent, enfin vous gagnez (Gandhi)

  2. #2
    Membre averti
    Avatar de HumanTool
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2006
    Messages : 276
    Points : 378
    Points
    378
    Par défaut
    Bon j'ai trouvé pour le problème du blob : mon commandtext faisait un 'select * from test' et visiblement dbexpress/oracle et le '*' font 6......donc en enumérant tout mes champs dans la requete je retrouve bien mon TBlobField.

    J'ai essayé les composants Zeos pour me connecter et magie j'ai bien les bon typage de champs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CdtZtestNUMTEST: TIntegerField;
    CdtZtestNOMTEST: TStringField;
    CdtZtestDATETIMETEST: TDateTimeField;
    CdtZtestDATETEST: TDateField;
    CdtZtestTIMETEST: TDateTimeField;
    CdtZtestSMALLINTTEST: TSmallIntField;
    CdtZtestMEMOTEST: TMemoField;
    CdtZtestBLOBTEST: TBlobField;
    Reste à savoir si les performances des composants Zeos sont correctes face à dbexpress....je continue mes tests
    D'abord ils vous ignorent, ensuite ils se moquent de vous, puis ils vous combattent, enfin vous gagnez (Gandhi)

  3. #3
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Citation Envoyé par HumanTool Voir le message
    je travaille actuellement au passage à dbexpress/Oracle d'une application sous BDE/Paradox.
    J'ai donc déposé sur une fiche test :
    - un TSQLConnection
    - un TSQLQuery
    - un TDataSetProvider
    - un TClientDataSet
    - un TDataSource
    - un TDBGrid
    Le TDataSetProvider a l'option 'AllowCommandText' et mon TClientDataSet a son commandtext 'SELECT * FROM TEST'
    Tien ça me rapelle quelque chose. On a voulu faire exactement la même chose il y a deux ans, dans le même context...

    On a rencontré de très gros problèmes de performances. Le plus catastrophique c'est sur les champs BLOB et CLOB. DbExpress devient très très lent dès que tu inclus un champ de ce type dans le SELECT.
    Pour les autres types de données, on n'a pas rencontré de problèmes particuliers.

    1-étant donné que oracle n'a pas de type, explicite, integer je me retrouve sous delphi avec un champ de type TFMTBCDField.
    J'aimerais pouvoir manipulé un champ TIntegerField qui me semble plus efficace...et de toute manière je n'ai pas besoin de géré des champs monétaires.
    Le type TFMTBCDField n'est pas un champ monétaire. Il s'agit seulement d'un type decimal en virgule fixe avec une précision paramétrable. Ce le type de champ qui correspond exactement au type NUMBER d'Oracle : C'est le type de données que te renverra Oracle en faisant un SELECT. Si tu veux un integer, il faudra faire une conversion à un niveau ou un autre.
    Avec un TClientDataSet, si tu charges les NUMBER(*,0) dans un Integer, tu vas faire une convertion à chaque champ. Si dans ton code tu n'utilises pas tous les champs et toutes les lignes rammenés par la base, tu risque de perdre du temps à faire des conversions pour rien...

  4. #4
    Membre averti
    Avatar de HumanTool
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2006
    Messages : 276
    Points : 378
    Points
    378
    Par défaut
    Pour les performances je vais voir...

    Le type TFMTBCDField est assimilé au type monétaire dans l'aide de delphi il me semble.....

    Le soucis c'est quand même d'éviter de changer tout mon code à cause d'un type qui n'existe pas dans oracle (Integer)....Comme tu le dis on ne pourra pas échapper à une conversion mais si tout est fait au niveau des composants ça me va, plutôt que de truffer mon code de conversions.

    Reste à savoir pourquoi les composants Zeos propose un TIntegerField et les différences de performances, parce que ils me font penser au BDE dans la façon de faire mais à voir...
    D'abord ils vous ignorent, ensuite ils se moquent de vous, puis ils vous combattent, enfin vous gagnez (Gandhi)

  5. #5
    Membre averti
    Avatar de HumanTool
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2006
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2006
    Messages : 276
    Points : 378
    Points
    378
    Par défaut
    Bon maintenant je bute sur l'édition de valeur j'ai constament une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-01722 Nombre non valide
    or j'édite que le NumTest et NomTest avec 888 et 'ooooo'....o_0
    J'ai rajouté un TSQLMonitor et voilà ce qu'il me sort :
    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
    [...]
    OCI 8 - OCIHandleAlloc
    OCI 8 - OCIHandleAlloc
    insert into "TEST"  ("NUMTEST", "NOMTEST", "MEMOTEST", "BLOBTEST") 
    values  (:1, :2, EMPTY_CLOB(), EMPTY_BLOB()) RETURNING MEMOTEST, BLOBTEST INTO :3, :4
    OCI 8 - OCIStmtPrepare
    OCI 8 - OCIAttrGet
    OCI 8 - OCIBindByPos
    OCI 8 - OCIBindByPos
    OCI 8 - OCIBindByPos
    OCI 8 - OCIBindByPos
    OCI 8 - OCIBindByPos
    OCI 8 - OCIBindByPos
    OCI 8 - OCIBindByPos
    OCI 8 - OCIBindByPos
    OCI 8 - OCIBindByPos
    OCI 8 - OCIStmtExecute
    OCI 8 - OCIErrorGet
    OCI 8 - OCIHandleFree(OCI_HTYPE_DESC)
    OCI 8 - OCIDescriptorFree
    OCI 8 - OCIDescriptorFree
    OCI 8 - OCIHandleFree(OCI_HTYPE_STMT)
    OCI 8 - OCITransCommit
    et pour Zeos c'est pire :
    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
    2009-02-11 11:50:55 cat: Connect, proto: oracle-9i, msg: CONNECT TO "XE" AS USER "test"
    2009-02-11 11:50:55 cat: Execute, proto: oracle-9i, msg: SET TRANSACTION ISOLATION LEVEL DEFAULT
    2009-02-11 11:50:55 cat: Execute, proto: oracle-9i, msg: END TRANSACTION
    2009-02-11 11:50:55 cat: Execute, proto: oracle-9i, msg: SET TRANSACTION ISOLATION LEVEL DEFAULT
    2009-02-11 11:50:56 cat: Execute, proto: oracle-9i, msg: SELECT * FROM TEST.TEST
     
    2009-02-11 11:50:57 cat: Execute, proto: oracle-9i, msg: SELECT * FROM TEST.TEST
     
    2009-02-11 11:50:57 cat: Execute, proto: oracle-9i, msg: SELECT NULL, OWNER, TABLE_NAME, COLUMN_NAME, NULL, DATA_TYPE, DATA_LENGTH, NULL, DATA_PRECISION, DATA_SCALE, NULLABLE, NULL, DATA_DEFAULT, NULL, NULL, NULL, COLUMN_ID, NULLABLE FROM SYS.ALL_TAB_COLUMNS WHERE OWNER LIKE 'TEST' AND TABLE_NAME LIKE 'TEST' AND COLUMN_NAME LIKE '%'
    2009-02-11 11:51:10 cat: Execute, proto: oracle-9i, msg: SELECT * FROM TEST.TEST
     
    2009-02-11 11:51:10 cat: Execute, proto: oracle-9i, msg: SELECT * FROM TEST.TEST
     
    2009-02-11 11:51:10 cat: Execute, proto: oracle-9i, msg: SELECT NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
    , errcode: 923, error: ORA-00923: mot-clé FROM absent à l'emplacement prévu
     
    2009-02-11 11:51:10 cat: Execute, proto: oracle-9i, msg: insert into "TEST.TEST"
      ("TEST.TEST"."NUMTEST", "TEST.TEST"."NOMTEST", "TEST.TEST"."MEMOTEST", "TEST.TEST"."BLOBTEST")
    values
      (?, ?, ?, ?)
     
    2009-02-11 11:51:10 cat: Execute, proto: oracle-9i, msg: insert into "TEST.TEST" ("TEST.TEST"."NUMTEST", "TEST.TEST"."NOMTEST", "TEST.TEST"."MEMOTEST", "TEST.TEST"."BLOBTEST") values (:P1, :P2, :P3, :P4) , errcode: 942, error: ORA-00942: Table ou vue inexistante
     
    2009-02-11 11:51:42 cat: Disconnect, proto: oracle-9i, msg: DISCONNECT FROM "XE"
    D'abord ils vous ignorent, ensuite ils se moquent de vous, puis ils vous combattent, enfin vous gagnez (Gandhi)

Discussions similaires

  1. Oracle et BLOB pour image dans un picture Box
    Par gueulederack dans le forum VB.NET
    Réponses: 4
    Dernier message: 13/09/2011, 15h21
  2. [Oracle] stocker une image dans oracle type BLOB
    Par dimainfo dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 25/03/2011, 17h06
  3. Erreur oracle avec BLOB
    Par identifiant_bidon dans le forum SQL
    Réponses: 5
    Dernier message: 05/11/2007, 21h56
  4. Réponses: 17
    Dernier message: 15/05/2006, 12h28
  5. [java][Oracle]Ouvrir un fichier(blob) avec le browser
    Par marsup54 dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 11/09/2003, 13h35

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