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 :

[FIREBIRD][FIREDAC] Taille maxi d'une chaine dans EXECUTE STATEMENT


Sujet :

Bases de données Delphi

  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 145
    Points : 1 389
    Points
    1 389
    Par défaut [FIREBIRD][FIREDAC] Taille maxi d'une chaine dans EXECUTE STATEMENT
    Bonjour

    Je viens de me lancer à utiliser FIREDAC sous Delphi XE7 après avoir utilisé IBDAC.

    Dans une procédure stockée, j'utilise un EXECUTE STATEMENT d'une très grosse chaine (plus de 5000 caractères). Cette procedure fonctionne très bien sous IBDAC, mais sous FIREDAC je recois une exception :
    String right truncation expected length 2100, actual 5231
    Donc je comprends que FIREDAC ne gère pas dans cette fonction des chaines de plus de 2100 caractères.

    j'ai 2 questions:
    1 - Y a t il un moyen d'augmenter la taille limite de cette chaine ?
    2 - Quelle est cette limitation pour FIREDAC dans la version utilisée avec la dernière version de Delphi ?


    merci d'avance
    Merci d'ajouter un sur les tags qui vous ont aidé

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 017
    Points : 40 931
    Points
    40 931
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Je ne suis pas sûr que le problème soit là, une procédure stockée c'est dans firebird donc si la chaine est dans firebird pas de soucis.
    Ou alors ce statement est un paramètre de la procédure ? (dangereux ça) auquel cas le problème est uniquement est problème de taille de paramètre.
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 145
    Points : 1 389
    Points
    1 389
    Par défaut
    Re

    Je suis bien d'accord c'est assez curieux, mais cela correspondant bien à la taille de la chaine dans la PS lancé par le EXECUTE STATEMENT.

    En utilisant IBDAC cela fonctionne sans problème...

    des idées ?
    merci
    Merci d'ajouter un sur les tags qui vous ont aidé

  4. #4
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Bonjour

    Ca m'intrigue aussi. Rien vu passer là dessus, mais seul un test avec la dernière version pourrait confirmé s'il y a eu modification.

    Comme proposé tout à l'heure pour un autre projet, s'il n'y a pas de dépendances à des produits tiers, je peux exceptionnellement faire une compilation du source en 10.4.1 et te fournir l'exe à tester.

    S'il était possible de faire un programme avec juste la requête et une base de test, ça mériterait d'être remonté si ça ne tourne pas avec la 10.4.1

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 017
    Points : 40 931
    Points
    40 931
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    je n'arrive toujours pas à comprendre
    -côté Firebird une chaine (varchar) peut faire jusqu'à 32765 caractères donc de ce côté 5000 passe sans soucis
    -Côté Firedac j'ai vu passé une dicussion où c'était plus de 8000 le problème pour les paramètres la suggestion élégante de passer par un blob (ftmemo)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ss := TStringStream.Create(log);
    p.LoadFromStream(ss, ftMemo);
    semble avoir clos le sujet. Je me demande si un ParambyName('stmt').asMemo n'aurait pas fonctionné

    Mais je n'ai toujours pas compris :
    - le processus exact ni l'environnement , XE7 et Firebird 2.5 ou 3 ?
    - le passage de ce Statement est-ce vraiment via un paramêtre genre :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE PROCEDURE TEST(STMT VARCHAR(6000)) 
    AS
    BEGIN
    EXECUTE STATEMENT STMT; 
    END;

    Sans parler du fait que ce soit dangeureux je n'arrive pas à voir une explication logique à ce genre de chose. J'utilise rarement des EXECUTE STATEMENT (uniquement sur des requêtes sur bases externes) et ces clauses, même paramètrées (oui c'est possible ) , sont toujours internes à la procédure

    Enfin, derniers points
    - est-ce que la taille du paramètre (si paramètre il y a ) est indiquée, pas juste type String ?
    Nom : Capture.PNG
Affichages : 144
Taille : 13,7 Ko
    il me semble que ce serait facile à vérifier

    - il faut savoir que quelques fois Firebird lève une erreur avec une mauvaise description cela pourrait-il en faire partie ...
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    String right truncation expected length 2100, actual 5231
    ça ressemble à vouloir stocker une chaîne de 5231 caractères dans un VARCHAR(2100)
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 145
    Points : 1 389
    Points
    1 389
    Par défaut
    Bonjour et merci à tous pour l’intérêt à cette discussion


    Je vais apporter quelques précisions qui pourront peut être vous aider.
    Je suis sous Firebird 3 (derniere version) et delphi XE7.

    la procédure stockée dans Firebird a la forme ci-dessous :

    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
    CREATE OR ALTER PROCEDURE Ps_Recup (    
        Id_Assoc           INTEGER,
      .....)
    RETURNS (
        Id_Donnee   INTEGER,
       ....)
    AS
      DECLARE VARIABLE Requete VARCHAR(20000);   -- Largement plus élevé que nécessaire
    .....
    BEGIN
    
    ......
    
    requete = ' select ......... ';  -- elle fait donc pls milliers de caractères mais en dessous de la valeur limite de 20000
    
       FOR EXECUTE STATEMENT Requete
         INTO :Id_Donnee,
       .....;
       Do SUSPEND;
    
    ......
    
    END;

    Du coté de Delphi, l'appel se fait à partir du composant TFDQuery de FIREDAC (associé à une transaction activée). Je rapelle quand untilisant l'équivalent dans IbDAC, TIBCQuery cela fonctionne parfaitement (d'où mon impression que le problème se situe au niveau de FireDAC).


    ....
    Query.sql.clear;
    Query.sql.add'SELECT Id_Donnee FROM Ps_Recup(:Id_Assoc, .....)';
    Query.Prepare;
    Query.ParamByName('Id_Assoc').AsInteger := Assoc;
    ....
    Query.Open;
    ...
    L’exception se produit à l’exécution de la commande "Query.Open;"

    J’espère avoir été plus clair ?
    N’hésitez pas me relancer ci vous souhaitez plus de précision


    Pour pprem, je peux en effet faire un projet de test. Le plus dure va être de créer une chaine bidon qui va faire plus de 2000 caractères et qui signifie quelque chose pour cette test . Quoique à priori les instructions contenues dans la chaine n'ont pas besoin d'être signifiante pour que le problème se produise. Si pprem est toujours ok, je prépare un projet test.

    A+
    Merci d'ajouter un sur les tags qui vous ont aidé

  8. #8
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Citation Envoyé par dehorter olivier Voir le message
    Pour pprem, je peux en effet faire un projet de test. Le plus dure va être de créer une chaine bidon qui va faire plus de 2000 caractères et qui signifie quelque chose pour cette test . Quoique à priori les instructions contenues dans la chaine n'ont pas besoin d'être signifiante pour que le problème se produise. Si pprem est toujours ok, je prépare un projet test.
    oui, oui, tout à fait :-)

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 017
    Points : 40 931
    Points
    40 931
    Billets dans le blog
    62
    Par défaut
    Je peux également faire le test
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #10
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 145
    Points : 1 389
    Points
    1 389
    Par défaut
    Bonjour à tous les 2

    Désolé pour le délai, je n'arrivais pas à recréer le problème dans un nouveau projet.

    Je viens enfin d'y parvenir, et cela m'a permit de résoudre ce problème qui en fait, est totalement, entièrement, complétement de ma faute

    Ma base utilise ISO8859_1 comme jeu de caractère. Hors dans les paramètres de connexion FIREDAC à cette base dans la propriété Params.CharacterSet de TFDConnection, j'ai indiqué UTF8 au lieu de ISO8859_1.

    Dans la plupart des situations cela fonctionne, mais pas pour cette requête particulière


    Je suis désolé de vous avoir embêté avec cela.



    A+
    olivier
    Merci d'ajouter un sur les tags qui vous ont aidé

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 017
    Points : 40 931
    Points
    40 931
    Billets dans le blog
    62
    Par défaut
    N'empêche, c'est bon à savoir, en général je ne renseigne pas le character set dans Firedac, mais, qui sait, une fois en passant
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  12. #12
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 145
    Points : 1 389
    Points
    1 389
    Par défaut
    Alors tant mieux si ma bêtise est utile
    Merci d'ajouter un sur les tags qui vous ont aidé

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/05/2012, 19h58
  2. Réponses: 1
    Dernier message: 14/02/2008, 09h37
  3. Comment surligner une chaine dans un RichEdit
    Par esteban63 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/09/2005, 01h33
  4. [JSP] mettre une chaine dans un format precis
    Par logica dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 09/06/2005, 11h21
  5. Réponses: 2
    Dernier message: 10/07/2002, 12h51

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