PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 2024 → Problème de conversion de données dans un assemblage .Net
Problème de conversion de données dans un assemblage .Net
Started by Frédéric RICHARD, Jul., 17 2024 3:58 PM - 4 replies
Registered member
27 messages
Posted on July, 17 2024 - 3:58 PM
Bonjour,

J’utilise l’assemblage IBM.Data.db2.iSeries pour accéder aux données d’un IBMi As/400.

Je lit les données d’un fichier mémo ( la colonne donnée est de type varchar(512) for bit data.

Lorsque je récupère cette zone, la méthode get_item me renvoie un tableau de 512 entiers non signés.

Je peux sans problème l’affecter à une variable de type buffer.

Par contre, ça coince dans l’autre sens.

J’essaye d’envoyer mon buffer avec la méthode set_item mais j’ai une erreur car le type de ma variable n’est pas du type attendu.

J’ai essayé de décaler un objet idb2varcharbinary mais cela ne fonctionne pas non plus.

En théorie, la méthode attend un tableau de bytes (byte[]) mais comment faire ?

Merci pour votre aide.
Registered member
4,111 messages
Posted on July, 17 2024 - 5:35 PM
Bonjour,
A première vue, il faut que tu "énumères" ton buffer octet par octet pour remplir le tableau d'octets que tu va passer en paramètre
A la volée ;
FONCTION SplitBuffer(bufMonParam est buffer) : tableau d'octet
nIndice est entier
tabParam est tableau d'octets

POUR nIndice=1 _A_ Taille(bufMonParam)
TableauAjoute(tabParam,bufMonParam[[nIndice]]
FIN

RENVOYER tabParam


--
Il y a peut être plus simple, mais, ça tourne
Registered member
27 messages
Posted on July, 18 2024 - 2:38 PM
Bonjour,

Merci pour votre retour.

A priori, cela ne fonctionne pas car la méthode set_item() de l'objet datarow ne prend pas de tableau d'octets en entrée.


https://hostimage.windev.io/images/Capturedécran20240718à143028_71d7cea6db26ec07ad0e46b003769eb6.png
Registered member
27 messages
Posted on July, 18 2024 - 3:16 PM
lorsque je passe par une chaine ANSI, Unicode, un Système.String, j'obtiens l'erreur suivante :

L'invocation de la méthode  du type  a échoué
Le framework .NET a renvoyé l'erreur suivante : 
Le type de valeur ne correspond pas au type de colonneImpossible de stocker <‰PNG

dans la colonne DONNEE. Type attendu est Byte[].

Pile des appels :
Méthode setItemByColumnName (cl_Fichier_dotNet.setItemByColumnName), ligne 58
Méthode ModifieMémoBinaire (cl_Fichier_dotNet.ModifieMémoBinaire), ligne 33
Méthode Modifie (cl_Fichier_dotNet.Modifie), ligne 40
Clic sur BTN_testdotnet (FEN_Principale.BTN_testdotnet), ligne 20

Date : 18/07/2024 15:14:59
Projet : Progescom_DevHFSQL

Informations supplémentaires :
Code erreur : 200002
Module : wd290net264.dll (01A290088m - 29.0.657.0)

Informations de débogage :
System.Reflection.TargetInvocationException: Une exception a été levée par la cible d'un appel. ---> System.ArgumentException: Le type de valeur ne correspond pas au type de colonneImpossible de stocker <‰PNG

dans la colonne DONNEE. Type attendu est Byte[]. ---> System.ArgumentException: Le type de valeur ne correspond pas au type de colonne

   à System.Data.Common.ObjectStorage.Set(Int32 recordNo, Object value)
   à System.Data.DataColumn.set_Item(Int32 record, Object value)
   --- Fin de la trace de la pile d'exception interne ---
   à System.Data.DataColumn.set_Item(Int32 record, Object value)
   à System.Data.DataRow.set_Item(DataColumn column, Object value)
   --- Fin de la trace de la pile d'exception interne ---
   à System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   à System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   à System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   à CDotNetMethod.bInvoke(Char* pszTypeName, Char* pszMethodName, Char* pszParameters, MethodInfo gcMethod, Object gcObj, CSLevel* pclPile, Int32 nNbParamPile, Int32 bValeurRetour, STOperationDotNet* pstOperation)
EIT_EXCEPTIONDOTNET
EIT_TYPE_WDFILE : <4>
EIT_IDCODE : <458752>
Registered member
27 messages
Posted on July, 22 2024 - 6:03 AM
Je me répond à moi même, si cela peut aider quelqu'un dans la difficulté.

Voici le code qui me permet d'affecter un Système.Byte[] dans ma colonne:
CAS "iDB2VarCharBitData"
tValue est un tableau d'entiers sans signe sur 1 octet = Value
sysObject est un System.Object dynamique <- tValue
:m_objCurrentRow.set_item(ColumnName,sysObject)
RENVOYER Vrai


Mes premiers tests sont très concluants.