Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Interfaces de programmation
Interfaces de programmation Forum d'entraide sur l'utilisation des API Oracle : Pré-compilateurs, OCI, OCCI, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/12/2011, 16h59   #1
Invité de passage
 
Inscription : décembre 2004
Messages : 11
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 11
Points : 1
Points : 1
Par défaut [OCILIB] OCI_LobRead erreur Access violation writing location

Salut,

je viens vous car j'ai un problème lors de l'utilisation de OCI_LobRead ou OCI_LobRead2.
J'ai un NCLOB d'environ 5000 caractères dans ma base de donnée, je n'ai eu aucun soucis pour l'insérer avec OCILIB mais j'ai une erreur "Access violation writing location" lorsque j'utilise OCI_LobRead ou OCI_LobRead2.
Je vous met en gros le code que j'utilise
Code :
1
2
3
4
5
 
TCHAR *szTemp = new TCHAR[5001];
OCI_Lob *oClob;
oClob = OCI_GetLob(m_PrivRs, num);
OCI_LobRead(oClob, szTemp, 5000);
Si je descend le nombre de caractère à 4000 dans les paramètre de la fonction je n'ai pas de plantage mais la chaine que je récupère est tronquée.
Si je laisse à 5000 j'ai l'erreur qui est levée mais quand je break le programme, la chaine à l'air de s'être remplie quand même.
J'ai essayé avec OCI_LobRead2 mais même j'ai exactement le même résultat.
Si vous avez un piste ça m'aiderait beaucoup.

Merci d'avance
capic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 22h21   #2
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
Et quelle est l'erreur ??

sinon essaie de faire le read dans un loop par chunk de 2048 par exemple. Le mieux de d'iterer par chunk dont la taille est retournée par OCI_LobGetChunkSize() (bonnes pratiques oracle)
__________________
Vincent Rogier.

Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

OCILIB (C Driver for Oracle)

Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2011, 15h20   #3
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
Version d'Oracle ?
Version d'OCILIB ?
Charset mode utilisé ?
Utilises tu UTF8 ?

Si tu utilises OCI_CHARSET_WIDE (ocilibw.dll), the upcoming v3.9.3 has a fix around OCI_LobRead() within this charset mode.
Here is the changelog of v3.9.3 (release date : 05/12/2011) :
Citation:
2011-12-05 Version 3.9.3 Vincent Rogier vince.rogier@ocilib.net

* Miscellaneous fixes

- Fixed broken support for Oracle 8i client since v3.9.0
- Fixed OCI_ObjectSetObject() : a bug had been introduced in v3.8.1 when computing internal object structure offsets and paddings
- Fixed OCI_LobRead(), OCI_LobRead2() : in OCI_CHARSET_WIDE charset builds only, a segfault could happen caused by an internal buffer overwrite
- Fixed OCI_SetStatementCacheSize(), OCI_GetStatementCacheSize() : an error ORA-24315 (with no incidence) could be thrown by some versions of Oracle clients
- Fixed OCI_BindXXX() : All binding methods returned TRUE instead of FALSE when an exception OCI_ERR_MAX_BIND occured
- Fixed OCI_GetString() : an error OCI-22061 was happening when the column was numeric and a user defined numeric format where provided with OCI_SetDefaultFormatNumeric()
- Fixed OCI_GetServerRevisionVersion() : it was returned the same value as OCI_GetServerMajorVersion() since v3.4.0
- Fixed internal method OCI_ParseSqlFmt() used in OCI_xxxFmt() calls : Quoted strings were not properly output since v3.9.0
- Fixed internal allocation mode :

- some OCI_BindXXX() calls were not compatible with OCI_BAM_INTERNAL allocation mode and when used with it, were causing segfaults if the host variable parameter was NULL
- now these methods raise an OCI_ERR_NULL_POINTER error if the host variable parameter is NULL and the statement bind allocation mode is set to OCI_BAM_INTERNAL

* Miscellaneous changes

- OCILIB library compilation

- Modified compile time detection of OCI client version when using OCI_IMPORT_LINKAGE as Oracle backported some defines introduced at version (X) in patches for version (X-1) !

- OCILIB documentation

- Updated Bind allocation mode description : added list of incompatible OCI_BindXXX() methods
- Added OCI_BAM_INTERNAL compatibility information in all OCI_BindXXX calls() documentation
- Added OCI_ENV_EVENTS requirements for subscriptions and HA methods
- Minor changes

- few code internal minor changes

- Removed in each OCILIB source file, the version number and date time (updated at each new release, using diff tools was a nigthmare !)
__________________
Vincent Rogier.

Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

OCILIB (C Driver for Oracle)

Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 08h52   #4
Invité de passage
 
Inscription : décembre 2004
Messages : 11
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 11
Points : 1
Points : 1
Merci pour tes réponses,
j'ai testé en version 3.9.1 d'OCILIB et j'utilisais bien la ocilibw.dll, l'erreur que j'avais était "Access violation writing location", je vais essayé ce matin la dernière version (3.9.3) et je te tiens au courant.

Edit :
Bon je viens de tester rapidement avec la dernière version et j'ai toujours le même soucis, ça vient peut-être de moi mais je vois pas en quoi.
On travaille avec oracle 10g, mon CLOB fait exactement 4873 caractères, pour tester je crée un TCHAR de 6001 caractères (plus tard j'utiliserai la et j'utilise ReadLob(oClob, szTemp, 6000) pour essayer de le lire. C'est à ce moment là que j'ai l'erreur "Access violation writing location".
Dis moi si j'utilise mal la fonction.
En attendant je vais essayer de le faire en découpant par morceau.

Merci d'avance
capic est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h17.


 
 
 
 
Partenaires

Hébergement Web