essaie
if (result.IsNull()) std::cout<<"Le BLOB est NULL"<<std::endl;
if (result.IsOpen') ) std::cout<<"Le BLOB est ouvert"<<std::endl;
Utilise le try catch du C++, pour récupérer l'exeption et regarder ce quel represente
essaie
if (result.IsNull()) std::cout<<"Le BLOB est NULL"<<std::endl;
if (result.IsOpen') ) std::cout<<"Le BLOB est ouvert"<<std::endl;
Utilise le try catch du C++, pour récupérer l'exeption et regarder ce quel represente
Quand je récupère mon result, je visualise ce qu'il contient avec visual et je vois que y a m_erri qui n'est pas égal à 0x00000000. Le problème c'est que je n'arrive pas a trouver a quoi l'erreur correspond 0x05572078.
Je pense que mon prob doit venir du result que je ne récupère pas bien
as tu essayer ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if (result.IsNull()) std::cout<<"Le BLOB est NULL"<<std::endl; if (result.IsOpen() ) std::cout<<"Le BLOB est ouvert"<<std::endl;
le BLOB est null et il est ouvert
C'est ce que je viens de vérifier justement. La base de données n'est pas modifiée. Le blob est toujours là (je viens de le visualiser).
Ce qui est bizarre c'est que en reprenant mon ancien code (celui de la première page), j'ai une erreur a ce niveau là :
result.Read((unsigned char *)szBlobBuffer,BLOB_SIZE);
Je récupérai bien une partie de pdf auparavant et maintenant, je récupère plus rien.
Edit : j'ai 2 ou 3 petites etourderies ca et la que je suis en train de corriger
Dis monGaulois, dans le code que tu m'as filé, buffer tu le déclares en tant que quoi?
Edit : Getsize est passé. Maintenant, il me demande le type de buffer
Code : Sélectionner tout - Visualiser dans une fenêtre à part f.write(buffer, NbLue);
Alors je viens de faire la modif que tu viens de me dire et à l'exécution, dès que je rentre dans
j'ai l'erreur suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part f.write((char*)buffer, NbLue);
invalid null pointer
Ca plante ici dans ostream
_DEBUG_POINTER(_Str);
C'est bon j'ai mis bufferTmp et ca marche nickel je génère le bon pdf qui va bien.
Maintenant au lieu de mettre write, il faudrait mettre le blob dans un tableau de byte je suppose ... Si tu pouvais m'aider monGaulois, ce serait sympa ... (enfin continuer a m'aider )
Voici tout le code de ma fonction:
A la place du write, il faudrait déclarer un tableau de byte, je pense et boucler sur le tableau pour y insérer à chaque fois le bufferTmp mais n'étant pas du tout doué en c++, je ne connais pas la syntaxe pour faire ceci.
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 CODE_RETOUR CFacturePayeur::FromRecordset(ServerGen::CRec* recObject){ TraceLogMetier(LOG_NIVEAU_DEBUG,LC_DEB_LOG,"FromRecordset"); OBlob result; unsigned char *buffer = 0; unsigned char *szBlobBuffer[BLOB_SIZE]; CODE_RETOUR iRetour = CODE_RETOUR_ERREUR_RECORDSET; if (recObject != NULL ) { if (recObject->isEOF()== false ) { m_IdFacture = __int32(recObject->GetLong(CFACTURE_PAYEUR_ID_FACTURE)); m_IdClient = __int32(recObject->GetLong(CFACTURE_PAYEUR_ID_CLIENT)); m_Date = CErgString(recObject->GetErgString(CFACTURE_PAYEUR_DATE_FACTURE)); m_MontantTTC = __int32(recObject->GetLong(CFACTURE_PAYEUR_MONTANT_FACTURE)); m_Etat = Etat_facture(__int32(recObject->GetLong(CFACTURE_PAYEUR_ID_FACTURE))); m_CrdSerial = __int32(recObject->GetLong(CFACTURE_PAYEUR_CRD_SERIAL_CARTE)); m_IdTypeCarte = __int32(recObject->GetLong(CFACTURE_PAYEUR_ID_TYPE_CARTE)); try { result = ((ServerOra::CRecOra*)recObject)->GetBlob(CFACTURE_PAYEUR_BLOB); } catch(std::exception e) { } std::ofstream f; f.open("c:/essai.pdf",std::ios::binary); unsigned long size = result.GetSize(); // calcul de la taille du buffertemporaire optimale unsigned long optchunk = result.GetOptimumChunkSize(); unsigned int bufsize = ((int)(32768/optchunk)) *optchunk; if (bufsize > size) bufsize = size; unsigned char *bufferTmp = new unsigned char[bufsize]; result.EnableStreaming(size); short status= OLOB_NEED_DATA; unsigned long NbLue=0; while(status == OLOB_NEED_DATA) { NbLue= result.Read(&status, bufferTmp , bufsize); // C'est ici qu'il faudra que je créé un tableau de byte pour pouvoir sérialiser après je pense f.write((char*)bufferTmp, NbLue); } result.DisableStreaming(); delete [] bufferTmp ; f.close(); } iRetour = CODE_RETOUR_REUSSI; } TraceLogMetier(LOG_NIVEAU_DEBUG,LC_FIN_LOG,"FromRecordset"); return iRetour; }
soit (version, je me la pète un peu et pas spécialement facile a relire)
ou, plus facile a lire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 //allocation du buffer du fichier; std::vector<unsigned char> monBufferDeFichier(size); int PositionFichier =0; while(status == OLOB_NEED_DATA) { PositionFichier += result.Read(&status, &monBufferDeFichier[PositionFichier ], (size-PositionFichier >bufsize) ? bufsize :size-PositionFichier ); }
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 //allocation du buffer du fichier; std::vector<unsigned char> monBufferDeFichier(size); int PositionFichier =0; while(status == OLOB_NEED_DATA) { //lecture du buffer NbLue= result.Read(&status, BufferTmp, bufsize ); //copie dans le buffer de fichier. je te le faite sans utiliser les algos et sans verification des taille //Ici tu pourrai utiliser l'algo COPY for(int i=0;i<NbLue;++i) monBufferDeFichier[PositionFichier +i]=BufferTmp[i]; //mise a jour de la position du fichier PositionFichier +=NbLue; }
Au faite, j'ai cru lire dans la doc que read ne peut lire d'un coup que de petit fichier de moins de 512Ko. Aprés faut faire comme cela.
Super c'est axectement ce que je voulais mais tu crois qu'il serait possible de placer tout le resultat obtenu (le blob) dans un std::string pour pouvoir le sérialiser après et si oui, on fait comment ??
Je sais que ma question est bête mais vraiment j'suis pas doué en c++.
Après normalement, si la sérialisation passe cela sera nickel
ok ben en tout cas, je te remercie beaucoup pour toute l'aide que tu as apporté. C'est super sympa.
Franchement c vraiment la classe
Mais je pense que le plus simple est d'utiliser un fichier temporaire que PHP va relire.
N'oublie pas de mettre résolue
Bonjour
Mongaulois j'ai "dérésolu" le post car j'ai un souci avec le code (l'une ou l'autre façon que tu m'as donné dans ton post d'hier a 15h41 donne le même résultat)
A l'exécution, j'ai un
ce qui doit signifier un dépassement d'indice. Tu en penses quoi? et surtout comment faudrait-il résoudre le problème ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part vector subscript out of range
Merci
Bonjour, a quel endroit?
C'est possible que je me suis planté dans la taille du vector
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager