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

C++ Discussion :

[Base de données] Ecriture / lecture d'un tableau dans un champs de type Binaire


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut [Base de données] Ecriture / lecture d'un tableau dans un champs de type Binaire
    Bonjour, j'essai de réduire le nombre d'enregistrements dans ma base de données.

    C'est pour cela que je cherche à écrire des tableaux de std::pair<float,float> dans un champs de type BINAIRE d'une base de données.

    En pratique cela donne
    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
     
    list< std::pair<float,float> > lst;
    /* remplissage de ma liste */
     
    std::pair<float,float> *tabDePoints;
    tabDePoints = new std::pair<float,float>[lst.size()];
    /* remplissage du tableau */
     
    list< std::pair<float,float> >::const_iterator it;
    int indiceTab = 0;
    for (it = lst.begin(); it!=lst.end(); ++it)
    {
    	tabDePoints[indiceTab] = (*it);
    	indiceTab++;
    }
     
    sCmd.Format(_T("INSERT INTO maTable(id,leTabDeVal) VALUES(%d, Ox%x)"),
                     m_iId, *tabDePoints);
    pAdo->ExecuteCommand(sCmd); //methode perso pour executer la commande
    Là première question :
    en écrivant *tabDePoints est ce que j'écris le contenu total de mon tableau ou seulement du première élément ?

    Deuxième question :
    Peut on écrire le contenu total d'un liste d'un seul coup dans un champs de type Binaire d'une base de données ?

    merci d'avance
    à bientôt

    Dernière question comment connaitre la taille de mon tableau de std::pair<float,float> ??

  2. #2
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Dis moi si j'ai bien compris ton problème :
    - tu as une liste de paires de flottants
    - tu la copie dans un tableau de paire de flottants
    - tu confie le tout à la méthode sCmd.Format
    - tu veux savoir ce qu'il se passe

    Et bien la réponse est : je n'en sais rien. Tout dépend de comment la fonction Format a été implémentée.

    Comme je suppose que ce n'est pas toi qui a fait cette méthode, mais que tu utilises une librairie, tu devrais te renseigner dans l'aide de cette librairie.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    Alors j'ai oublié de préciser un certains nombre de chose :

    sCmd est de type CString, donc Format() est la méthode de cette classe MFC.

    Ensuite cette requête s'effectue correctement, et m'écrit dans la base quelque chose comme : 0x3971ac00 sur 4 octets donc (alors que mon tableau contient plus d'une paire de flottants donc forcement plus d'une fois 8 octets).

    L'une des questions que je me pose c'est, est-ce que quand j'écris *tabDePoints cela correspond à l'ensemble de mon tableau de paire flottants ou alors au première élément flottant de l'indice 0 (tabDePoints[0].first()) ?

    Est ce plus clair comme question

  4. #4
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Citation Envoyé par toto4650
    L'une des questions que je me pose c'est, est-ce que quand j'écris *tabDePoints cela correspond à l'ensemble de mon tableau de paire flottants ou alors au première élément flottant de l'indice 0
    C'est les deux.
    Tu as une explication assez convaincante de ce qu'est un tableau :ici

    Apparement la fonction Format des CString utilise des paramètres à la mode printf, ce qui n'est pas très sur, tu pourrais envisager de passer par des std::string pour construire tes CString (dont tu as apparement besoin pour accéder à ta bdd).

    Le problème de cette façon de faire est que l'interprétation du type des paramètres que tu leur donne (ici ton tableau) se fait en fonction du code que tu leur fourni (ici %x). Il existe peut-être un code qui signifie "tableau de paire d'entier", mais j'en doute.

    Je n'ai pas de meilleure proposition à te faire que de passer par des flux std pour créer une chaine de caractère que tu convertira en CString ensuite.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    En effet je viens de faire un test et c'est vérifier...

    Bref du coup si je veux copier d'un coup mon tableau dans ma base il faut que j'utilise autre chose. Mais quoi ?
    là je suis paumé dans le floue total. Please Help !

    De plus comment puis je connaître la taille de mon tableau, en effet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    sizeof(monTab) = 4
    sizeof(*monTab) = 8
    alors que mon tableau contient plus d'un élément...
    je loose complet
    merci en tout cas pour ton lien et tes réponses rapides

  6. #6
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Désolé, j'ai mis à jour ma précédente réponse pendant que tu écrivais.

    Si tu utilises des flux, tu ne devrais plus avoir besoin de ton tableau.
    Ce qui est bien, cela dit en passant, car copier deux fois tes données une fois dans une liste et une fois dans un tableau, c'est quelque chose que tu souhaites éviter.

    Cela dit, il n'y a pas moyen de connaitre la taille d'un tableau.
    Ce n'est pas une information qui est accessible.
    Soit tu l'as gardé quelque part (en l'occurence c'est le cas, il s'agit de lst.size()), soit tu ne peux pas la connaitre.
    C'est une des raisons qui fait qu'en général, tu ne veux utiliser des tableaux que dans des cas particuliers (tableaux de constantes par exemple), et que tu préfères des conteneurs plus évolués.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    Cela voudrait dire que je peux insérer d'un coup toute ma liste dans la base en une seule requête ?

    Si tel est le cas je ne vois pas quelle syntaxe utiliser j'ai regarder ce valent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sString.Format(T("lst = %x \n lst.size = %d"),lst,lst.size());
    et j'obtient

    lst = cccccc
    lst.size() = 35150736



    En fait pour revenir au problème de base, il faudrait que je sache insérer dans ma base quelquechose (quoi ? je ne sais pas) qui soit le contenu de ma liste.
    Pour cela mon champs de BDD est de type VARBINARY.
    Est ce que la sérialisation ne pourrais pas m'aider ?

  8. #8
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Citation Envoyé par toto4650
    C'est pour cela que je cherche à écrire des tableaux de std::pair<float,float> dans un champs de type BINAIRE d'une base de données.
    Citation Envoyé par toto4650
    Cela voudrait dire que je peux insérer d'un coup toute ma liste dans la base en une seule requête ?
    Ce que tu veux n'est pas clair. Tu veux mettre toute ta liste dans un seul champ, ou tu veux créer un enregistrement par paire ?

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Feriaman
    Ce que tu veux n'est pas clair. Tu veux mettre toute ta liste dans un seul champ, ou tu veux créer un enregistrement par paire ?
    je veux mettre toute la liste dans un seul champs c'est exactement ca !
    désolé

  10. #10
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Citation Envoyé par toto4650
    je veux mettre toute la liste dans un seul champs c'est exactement ca !
    Dans ce cas, il me semble que c'est une bonne première approche de mettre toute ta liste dans une seule requête. Si jamais tu tombres sur un problème de mémoire ou quoi, tu pourras envisager de faire cela en plusieurs requêtes, mais ce n'est pas par là qu'il faut commençer.

    Il existe peut-être des fonctions particulières de la bdd que tu utilises qui permettent de copier des données de la mémoire à la bdd sans passer par une requête. Si c'est le cas, je ne peux pas t'aider, car je ne sais pas quelle bdd tu utilises, et même dans ce cas-là il est improbable que je connaisse son api.

    Dans le cas contraire, formatter ta requête à partir de ta liste peut être fait en utilisant des flux standards. Tu devrais te renseigner là-dessus.

  11. #11
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Feriaman
    Dans ce cas, il me semble que c'est une bonne première approche de mettre toute ta liste dans une seule requête.
    Oui en effet ! mais le problème c'est que, syntaxiquement je ne sais pas comment m'y prendre pour écrire tout le contenu de ma liste dans la requête.

    En utilisant les flux je ne parviens qu'a pointer le premier élément du premier indice, et c'est là tout mon problème...

    J'ai commencer à founier dans la sérialisation et il semblerais que je puisse trouver des trucs plus lourds mais pas mal...

    merci pour ton aide en tout cas

  12. #12
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Si tu veux utiliser une bibliothèque de sérialisation, il parait que boost est très bien.

    Sinon, ton problème de premier élément vient du fait que tu travailles à partir d'un tableau, mais a priori tu n'en a pas besoin.

    Si au lieu de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    tabDePoints = new std::pair<float,float>[lst.size()];
    int indiceTab = 0;
    for (it = lst.begin(); it!=lst.end(); ++it)
    {
    	tabDePoints[indiceTab] = (*it);
    	indiceTab++;
    }
    tu faisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    tabDePoints = new std::pair<float,float>[lst.size()];
    int indiceTab = 0;
    for (it = lst.begin(); it!=lst.end(); ++it)
    {
    	// ici tu mets "*it" dans ton flux
    }
    tu n'aurais plus de problème

  13. #13
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Bonjour, j'essai de réduire le nombre d'enregistrements dans ma base de données.

    C'est pour cela que je cherche à écrire des tableaux de std::pair<float,float> dans un champs de type BINAIRE d'une base de données.
    Mauvaise idée.
    Tu détruis l'intégrité logique de ta base de données.

    Voir le modèle entité-association.
    Boost ftw

  14. #14
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Feriaman
    tu faisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    tabDePoints = new std::pair<float,float>[lst.size()];
    int indiceTab = 0;
    for (it = lst.begin(); it!=lst.end(); ++it)
    {
    	// ici tu mets "*it" dans ton flux
    }
    tu n'aurais plus de problème
    Si j'aurai exactment le même problème ! Si je met tabDePoints, ou *tabDePoints ca me donne le même résultat puisque *it pointe sur UNE SEULE paire de float !
    moi ce que je voudrais c'est écrire toute mes paires de float d'un seul coup.

    Je vais voir du côté de boost, merci

  15. #15
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Citation Envoyé par toto4650
    moi ce que je voudrais c'est écrire toute mes paires de float d'un seul coup.
    Pourquoi ?

  16. #16
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    Eh bien pour réduire mon nombre d'enregistrement dans la base !
    En clair pour schématiser voici ce que je veux faire :

    au lieu d'écrire :
    id | valeur
    -------------
    1 | 51
    1 | 55
    1 | 62
    2 | 65
    2 | 69
    3 | 37

    soit 6 enregistrements pour 3 Identifiant distinct

    j'écris :
    un_autre_id | montab(Binaire)
    ----------------------
    123 | 01000101011010... //1-->51 - 1-->55 - 1-->62
    124 | 10110111101011... //2-->65 - 2-->69

    montab = mon tableau de paires qui contient les valeurs correspondant à un identifiant. Du coup avec un enregistrement je suis capable de récupérer 3 informations pour l'identifiant 1 par exemple...
    Ce qui, avec un nombre d'enregistrement conséquent, peux faire baisser la taille de la BDD considérablement.

    est ce plus clair

  17. #17
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Oui, c'était déjà clair auparavent.

    Tu as l'air de croire que parce que tu mets tes floats un par un (ou deux par deux) dans ta requête, ils seront forcément dans des enregistrements différents.

    Or ce n'est pas le cas.

  18. #18
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    Oulàaa ...
    Comment semet le doute en une phrase. Peux tu préciser ta remarque ?

    Tu voudrais dire que un enregistrement contenant un champ qui a pour valeur l'ensemble d'un tableau de pair de float serait plus gros que plusieurs enregistrement contenant 2 champs de type float (quel phrase on ne peut plus clair !).

    si tel était le cas il serait de toute façon avantageux pour moi de diminuer le nombre de requête. Cela resterait donc une bonne solution.

  19. #19
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Citation Envoyé par toto4650
    Tu voudrais dire que un enregistrement contenant un champ qui a pour valeur l'ensemble d'un tableau de pair de float serait plus gros que plusieurs enregistrement contenant 2 champs de type float (quel phrase on ne peut plus clair !).
    Non, tout ce que je veux dire, c'est que tu peux construire petit à petit une requête qui va créer un enregistrement. Tu n'es pas obligé de la coder en une instruction.
    Prenons un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    std::ostringstream ossReq;
    ossReq << "insert into matable (id,data) values(42,'";
     
    ossReq << "a";
    ossReq << "b";
    ossReq << "c";
    ossReq << "d";
    ossReq << "e";
    ossReq << "f";
     
    ossReq << "');";
    feriamanLauchRequest(ossReq);
    lors de l'appel de feriamanLauchRequest, le flux passé en paramètre contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into matable (id,data) values(42,'abcdef');
    Je n'aurait donc bien qu'un seul enregistrement, un seul champ qui contient "abcdef" et pourtant j'ai construit ma requête en plusieurs fois.

    par comparaison, ton approche ressemble plutot à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    char myArray[] = new char[6];
    myArray[0] = 'a';
    myArray[1] = 'b';
    myArray[2] = 'c';
    myArray[3] = 'd';
    myArray[4] = 'e';
    myArray[5] = 'f';
     
    std::ostringstream ossReq;
     
    ossReq << "insert into matable (id,data) values(42,'" << myArray << "');";
    et non seulement c'est dépenser de l'énergie pour rien, mais en plus c'est plus dur à faire.

    Note : feriamanLauchRequestn'est pas une fonction de ta librairie de bdd, c'est juste pour l'exemple. Je lui donne un nom bizare pour que tu ne la prenne pas pour telle.

  20. #20
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    Ok !
    j'ai compris ca m'a l'air pas mal du tout, je vais essayer de mettre en oeuvre et je rendrai compte des résultats dès que j'y suis arriver,

    mille merci en tout cas

Discussions similaires

  1. Ecriture/Lecture d'un tableau de float
    Par Socolin dans le forum C#
    Réponses: 2
    Dernier message: 04/05/2010, 10h32
  2. Code VBA-Base de données en lecture seule
    Par @lex7020 dans le forum VBA Access
    Réponses: 1
    Dernier message: 22/11/2007, 16h12
  3. [Ouverture Base] Base de données en lecture seule
    Par Zartak dans le forum VBA Access
    Réponses: 7
    Dernier message: 10/05/2007, 15h22
  4. base de donnée en lecture seule
    Par LeXo dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 09/02/2007, 16h14
  5. Impossible de fermer une base de données en lecture
    Par requiemforadream dans le forum ASP
    Réponses: 7
    Dernier message: 21/04/2005, 16h58

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