@@ -186,9 +186,11 @@ static PyObject *Object_Repr(udt_Object *self)
186186// Convert a Python value to an Oracle value.
187187//-----------------------------------------------------------------------------
188188static int Object_ConvertFromPython (udt_Object * obj , PyObject * value ,
189- dpiNativeTypeNum * nativeTypeNum , dpiData * data , udt_Buffer * buffer )
189+ dpiOracleTypeNum oracleTypeNum , dpiNativeTypeNum * nativeTypeNum ,
190+ dpiData * data , udt_Buffer * buffer )
190191{
191192 PyObject * textValue , * valueType ;
193+ const char * encoding ;
192194 udt_Object * otherObj ;
193195 udt_LOB * lob ;
194196 int status ;
@@ -214,8 +216,12 @@ static int Object_ConvertFromPython(udt_Object *obj, PyObject *value,
214216 if (status < 0 )
215217 return -1 ;
216218 } else {
217- if (cxBuffer_FromObject (buffer , value ,
218- obj -> objectType -> connection -> encodingInfo .encoding ) < 0 )
219+ if (oracleTypeNum == DPI_ORACLE_TYPE_NCHAR ||
220+ oracleTypeNum == DPI_ORACLE_TYPE_NVARCHAR ||
221+ oracleTypeNum == DPI_ORACLE_TYPE_NCLOB )
222+ encoding = obj -> objectType -> connection -> encodingInfo .nencoding ;
223+ else encoding = obj -> objectType -> connection -> encodingInfo .encoding ;
224+ if (cxBuffer_FromObject (buffer , value , encoding ) < 0 )
219225 return -1 ;
220226 }
221227 * nativeTypeNum = DPI_NATIVE_TYPE_BYTES ;
@@ -362,8 +368,8 @@ static int Object_SetAttributeValue(udt_Object *self,
362368 int status ;
363369
364370 cxBuffer_Init (& buffer );
365- if (Object_ConvertFromPython (self , value , & nativeTypeNum , & data ,
366- & buffer ) < 0 )
371+ if (Object_ConvertFromPython (self , value , attribute -> oracleTypeNum ,
372+ & nativeTypeNum , & data , & buffer ) < 0 )
367373 return -1 ;
368374 status = dpiObject_setAttributeValue (self -> handle , attribute -> handle ,
369375 nativeTypeNum , & data );
@@ -421,7 +427,8 @@ static int Object_InternalAppend(udt_Object *self, PyObject *value)
421427 int status ;
422428
423429 cxBuffer_Init (& buffer );
424- if (Object_ConvertFromPython (self , value , & nativeTypeNum , & data ,
430+ if (Object_ConvertFromPython (self , value ,
431+ self -> objectType -> elementOracleTypeNum , & nativeTypeNum , & data ,
425432 & buffer ) < 0 )
426433 return -1 ;
427434 status = dpiObject_appendElement (self -> handle , nativeTypeNum , & data );
@@ -718,7 +725,8 @@ static PyObject *Object_SetElement(udt_Object *self, PyObject *args)
718725 if (!PyArg_ParseTuple (args , "iO" , & index , & value ))
719726 return NULL ;
720727 cxBuffer_Init (& buffer );
721- if (Object_ConvertFromPython (self , value , & nativeTypeNum , & data ,
728+ if (Object_ConvertFromPython (self , value ,
729+ self -> objectType -> elementOracleTypeNum , & nativeTypeNum , & data ,
722730 & buffer ) < 0 )
723731 return NULL ;
724732 status = dpiObject_setElementValueByIndex (self -> handle , index ,
0 commit comments