Mysql (Result a Array en C) solicitud de ayuda.
Posted: Mon Mar 01, 2021 5:04 pm
Estimados necesito de su gran ayuda.
Siguiendo con mi intento de mejorar TmySQL, he notado que al pasar a array una consulta, todos los datos vienen como cadena de caracteres, por lo que he intentado modificar este comportamiento.
mi idea es que previo a pasar los datos del result, obtener el tipo de dato de la columna, para eso uso un ciclo for y la funcion SQL2ClipType que retornara un caracter segun sea el caso si la columna es de tipo [C]har, [N]um, [D]ate, [M]emo, [L]ogic, la idea es agregar ese dato a un arreglo char para por ejemplo si la tabla tiene las siguiente columnas: CHAR, NUMERIC, DATE, LOGICAL, MEMO, tendria en la variable szTypeFields el contenido "CNDLM", esto para ser usado luego
Cade señalar que este funcion proviene de dolphin. solo intento mejorarla.
Siguiendo con mi intento de mejorar TmySQL, he notado que al pasar a array una consulta, todos los datos vienen como cadena de caracteres, por lo que he intentado modificar este comportamiento.
mi idea es que previo a pasar los datos del result, obtener el tipo de dato de la columna, para eso uso un ciclo for y la funcion SQL2ClipType que retornara un caracter segun sea el caso si la columna es de tipo [C]har, [N]um, [D]ate, [M]emo, [L]ogic, la idea es agregar ese dato a un arreglo char para por ejemplo si la tabla tiene las siguiente columnas: CHAR, NUMERIC, DATE, LOGICAL, MEMO, tendria en la variable szTypeFields el contenido "CNDLM", esto para ser usado luego
Cade señalar que este funcion proviene de dolphin. solo intento mejorarla.
Code: Select all
HB_FUNC( MYSQL_QUERY2ARRAY )
{
MYSQL *mysql = (MYSQL *) hb_MYSQL_par( 1 );
if( mysql )
{
PHB_ITEM itemReturn = hb_itemArrayNew( 0 );
if( mysql_real_query( mysql, (const char *) hb_parc( 2 ), (unsigned long) hb_parclen( 2 ) ) == MYSQL_QUERY_SUCCESS )
{
MYSQL_RES *mresult = mysql_store_result( mysql );
if( mresult )
{
PHB_ITEM pBlock = hb_param( 3, HB_IT_BLOCK ) ? hb_param( 3, HB_IT_BLOCK ) : NULL;
PHB_ITEM itemRow = hb_itemNew( NULL );
PHB_ITEM Count = hb_itemNew( NULL );
PHB_ITEM Rec = hb_itemNew( NULL );
unsigned int uiNumFields, uiX;
HB_LONGLONG llNumRows, llRec;
MYSQL_FIELD *mField;
MYSQL_ROW mrow;
const char *szTypeField;
char szTypeFields[]="";
char letra;
uiNumFields = mysql_num_fields( mresult );
for( uiX = 0; uiX < uiNumFields; uiX++ ) //aca obtengo los tip
{
mField = mysql_fetch_field_direct( mresult, uiX );
szTypeField = SQL2ClipType( ( long ) mField->type ); //aca obtengo que tipo de datos xbase es c/columna
hb_xstrcat( szTypeFields, szTypeField, 0); //aca lo acumulo en un arrelo char
}
//OutStr( szTypeFields ); //CNDLM example
llRec = 0;
llNumRows = mysql_num_rows( mresult );
mysql_data_seek( mresult, 0 );
while( ( mrow = mysql_fetch_row( mresult ) ) != NULL ) //aca el ciclo para pasar el result a array
{
if( mrow )
{
hb_arrayNew( itemRow, uiNumFields );
for( uiX = 0; uiX < uiNumFields; uiX++ ) // ciclo para recorrer cada columna del result
{
//mi idea es obtener el tipo de dato xbase acumulado anteriormente
//y convertir el dato segun el tipo
//pero me falto conocimiento. :-)
/*
letra = szTypeFields[ uiX + 1 ];
switch ( letra )
{
case 'C':
//hb_arraySetC( itemRow, uiX + 1, mrow[ uiX ] );
break;
case 'N':
//hb_arraySetNI( itemRow, uiX + 1, mrow[ uiX ] );
break;
case 'D':
//hb_arraySetDS( itemRow, uiX + 1, mrow[ uiX ] );
break;
case 'L':
//hb_arraySetL( itemRow, uiX + 1, mrow[ uiX ] );
break;
}
*/
//este es el codigo que pasa el valor al array (ver que todo lo pasa como cadena de caracteres)
if( mrow[ uiX ] == NULL )
{
hb_arraySetC( itemRow, uiX + 1, NULL );
}
else
{
hb_arraySetC( itemRow, uiX + 1, mrow[ uiX ] );
}
} //end for
hb_arrayAddForward( itemReturn, itemRow );
hb_itemPutNLL( Rec, llRec++ );
hb_itemPutNLL( Count, llNumRows );
if( pBlock )
{
hb_evalBlock( pBlock, itemRow, Rec, Count, NULL );
}
}
} //end while
mysql_free_result( mresult );
hb_itemRelease( itemRow );
hb_itemRelease( Count );
hb_itemRelease( Rec );
}
}
hb_itemReturnRelease( itemReturn );
}
else
{
hb_errRT_BASE( EG_ARG, 2020, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
}
}