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 :

SQL String // Chaine de caractères trop longue


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 157
    Points : 80
    Points
    80
    Par défaut SQL String // Chaine de caractères trop longue
    Delphi 7 // Ado // Access 2000

    J''ai écrit un programme qui permet de importer des données (fiches clients)
    venant d'une base de données MySQL (Internet) dans un base de données locale du type Access 2000.

    Je regroupe tous les champs dans un string ( variable ws) pour avoir une seule instruction SQL au lieu d'exuter 119 requettes ce qui correpond au nombre des champs dans une de me tables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                                mysqlcommand.Text := ws;
                                AdoQuery1.SQL.Text := mysqlcommand.Text;
                                AdoQuery1.ExecSQL;
    Le problème c'est que la variable ws ne supporte pas plus de 1023 caractères ... ce qui est peut pour un string ...

    Comment doit je faire (construire ma chaine SQL) pour contourner cette limitte? Ma chaine de données est bien plus longue ... parfois 5000 caractères...

    Merci d'avance pour votre aide

  2. #2
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Si la variable ws est de type string, elle n'est certainement pas limitée a 1023 caractère.

    Quelle utilité de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mysqlcommand.Text := ws;
    AdoQuery1.SQL.Text := mysqlcommand.Text;
    alors que directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AdoQuery1.SQL.Text := ws;
    Pour être certain du contenu de AdoQuery1.SQL faire un AdoQuery1.SQL.Text.SaveToFile('c:\requete.sql'); et voir le contenu du fichier.

    Enfin, y-a-t-il une exception qui nous dit que ca va pas ? Si oui, de quel type et quel est le message ?
    "Si vous voulez être l’esclave des banques et payer pour financer votre propre esclavage, alors laissez les banquiers créer la monnaie" - Josiah Stamp, 1920, Gouverneur de la Banque d’Angleterre
    "Qui ne peut acheter ruine qui voudrait vendre" - Jacques Duboin.
    "Nous n'héritons pas la terre de nos parents, nous l'empruntons à nos enfants." - Antoine de Saint Exupéry

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    Salut neilbgr,

    Merçi bien pour ton aide.

    Je vais essayer, tout à l'heure, de suivre ton conseil et appliquer la methode

    ... AdoQuery1.SQL faire un AdoQuery1.SQL.Text.SaveToFile('c:\requete.sql')...
    Je vous tiens informé de la suite ... à tout à l'heure.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    J’ai réécrit une partie de mon programme ...

    Le programme place d’abord la requête SQL est dans un fichier text.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    AssignFile(SQLFile, 'sqlfile.txt');
    ReWrite(SQLFile);
    Write(SQLFile, 'UPDATE DOSSIER SET ');
    //.... suite de la construction de l'instruction SQL ...
    Ensuite mon programme exécute les lignes suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    AdoQuery1.SQL.Clear;
    AdoQuery1.SQL.LoadFromFile('sqlfile.txt');
     
    // la ligne suivante sert a vérifier le contenue du SQL string (debugging).
    ws := AdoQuery1.SQL.Text;
     
    try
        AdoQuery1.ExecSQL;
    except
        // ....
    end;
    Après l'exécution de la ligne " AdoQuery1.ExecSQL; " je reçoit un message d'erreur ... disant :

    Notification d'une exception du débuguer

    Le projet Datamanager.exe a provoqué une classe d'exception EOleException avec le message 'Object Parameter défini de manière incorrecte. Des informations incohérentes ou incomplètes ont été fournies'. Processus stoppé. ....
    Ceci est liée au fait que le contenu du fichier "sqlfile.txt " n'est pas importée dans son intégralité par la commande AdoQuery1.SQL.LoadFromFile('sqlfile.txt'); . Le fichier "sqlfile.txt " pèse 6.62 ko .

    Quelqu’un à une idée et peut me dire comment faire pour " importer " l'intégralité de mon fichier sqlfile.txt au composant AdoQuery :

  5. #5
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    Il n'y aurait pas une limitation quelque part ?

    Car on est bien d'accord pour dire que AdoQuery1.SQL contient complétement la requête, n'est-ce pas ?
    Si oui, une exception du type EOleException signifie que le moteur de base de données n'est pas d'accord avec ce qu'on lui donne.
    Ainsi, on ecarte bien la résponsabilité de Delphi dans cette histoire.

    Je me pencherai donc plus vers une limitation d'Acces, voire la requete elle-meme.

    Pour les limitations d'acces j'ai trouvé ceci :
    http://www.aspfaq.com/show.asp?id=2345

    Et puis après tout, pourquoi a tout prix vouloir faire une seule requete ? Faire quelquechose pour n lignes pose des pb !? (n = 1000 par exemple)
    "Si vous voulez être l’esclave des banques et payer pour financer votre propre esclavage, alors laissez les banquiers créer la monnaie" - Josiah Stamp, 1920, Gouverneur de la Banque d’Angleterre
    "Qui ne peut acheter ruine qui voudrait vendre" - Jacques Duboin.
    "Nous n'héritons pas la terre de nos parents, nous l'empruntons à nos enfants." - Antoine de Saint Exupéry

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    Et puis après tout, pourquoi a tout prix vouloir faire une seule requete ?
    Mon programe exporte des données se trouvent dans une BD Accèss et importe des données à partir d'un serveur MySQL. Le transfert des données passe via Internet! Actuellemnt le programme , nomé Datamanager, importe ou exporte les données, requette par requette, cela prend trop de temps. Si non mon programe fonctionne déja bien dépuis plus d'une année, sauf qu'il souffre de lenter. Une fiche client, stocké dans une des tables (DOSSIER), contient 119 champs et cela correspond à 119 requettes ... cela prend du temps... trop du temps ! En ce que concerne la partie export, regroupent des données a exporter au sein d'une seule requette, mon programme fonctionne très bien. Ce que veut dire que MySQL gère bien la requette unique (par fiche client).

    Je me pencherai donc plus vers une limitation d'Acces, voire la requete elle-meme.
    Côte import:
    Oui, peut être c'est access qui n'aime pas la longeur de ma requette ... Il faut que je fasse quelques tests.

    Dans le lien que tu viens nous donner j'ai trouvé peut-être une piste pour percer le mistère....
    C'est peut -être " Number of bytes per row : max 2000 " qui fixe la limite ... A voire ... Je vous tiens informé de la suite.

  7. #7
    Membre régulier Avatar de valoji
    Inscrit en
    Septembre 2005
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2005
    Messages : 124
    Points : 81
    Points
    81
    Par défaut BDE, longueur de chaine en sql : 256 BYTES
    Bonjour,

    Le probleme est dans ta requet SQL, La longueur d'une chaine ne peut depasser 256 BYTES, sur une connexion BDE.

    Soit tu passes par TTABLE, ou utilise DBEXPRESS (Pas essayer encore, mais corrige le problème du BDE).

    Valoji.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    Salut valoji,

    Merci pour l'information.
    Je vais essayer d'étudier ça dans les jours à venir ...
    Je vous tiens informé de la suite ...

    A+

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/02/2015, 11h19
  2. [Sous rapport] Chaine de caractère trop longue
    Par msurf dans le forum iReport
    Réponses: 5
    Dernier message: 28/03/2007, 16h24
  3. Réponses: 12
    Dernier message: 09/09/2006, 11h54
  4. Réponses: 15
    Dernier message: 23/01/2006, 04h35
  5. [SQL] Aggrégation chaine de caractère SELECT
    Par lucie.houel dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 13/01/2006, 09h12

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