|
From: Carlos G.A. <car...@ho...> - 2002-06-19 17:40:36
|
Hello:
In visual foxpro when you execute a Statement with sqlexec like this:
sqlexec( gnHConn,"SELECT SUM(field) FROM TABLE", "CURSOR")
if the field in the sum is a DECIMAL field in Firebird, Visual Foxpro
converts it in Character because the driver returns JDBC_BIGINT as column
type i have a little fix for this issue and return JDBC_DECIMAL instead of
SQL_BIGINT for DECIMAL FIELDS( i ´m very pleased if any can confirm to me
that this fix is correct ):
Sqlda.h:
Change:
static int getSqlType (int iscType, int subType);
static const char* getSqlTypeName (int iscType, int subType);
to :
static int getSqlType (int iscType, int subType, int sqlScale);
static const char* getSqlTypeName (int iscType, int subType, int sqlScale);
Sqlda.cpp:
int Sqlda::getColumnType(int index)
{
XSQLVAR *var = sqlda->sqlvar + index - 1;
return getSqlType (var->sqltype, var->sqlsubtype, var->sqlscale);
}
int Sqlda::getSqlType(int iscType, int subType, int sqlScale)
{
switch (iscType & ~1)
{
case SQL_TEXT:
return JDBC_CHAR;
case SQL_VARYING:
return JDBC_VARCHAR;
case SQL_SHORT:
if ( sqlScale < 0 )
return JDBC_DECIMAL;
return JDBC_SMALLINT;
case SQL_LONG:
if ( sqlScale < 0 )
return JDBC_DECIMAL;
return JDBC_INTEGER;
case SQL_INT64:
if ( sqlScale < 0 )
return JDBC_DECIMAL;
return JDBC_BIGINT;
case SQL_QUAD:
return JDBC_BIGINT;
case SQL_FLOAT:
return JDBC_REAL;
case SQL_DOUBLE:
if ( sqlScale < 0 )
return JDBC_DECIMAL;
return JDBC_DOUBLE;
case SQL_TIMESTAMP:
return JDBC_TIMESTAMP;
case SQL_TYPE_TIME:
return TIME;
case SQL_TYPE_DATE:
return jdbcDATE;
case SQL_BLOB:
if (subType == 1)
return JDBC_LONGVARCHAR;
return JDBC_LONGVARBINARY;
case SQL_ARRAY:
NOT_SUPPORTED("array", 0, "", 0, "");
}
return 0;
}
const char* Sqlda::getSqlTypeName(int iscType, int subType, int sqlScale)
{
switch (iscType & ~1)
{
case SQL_TEXT:
return "CHAR";
case SQL_VARYING:
return "VARCHAR";
case SQL_SHORT:
if ( sqlScale < 0 )
return "DECIMAL";
return "SMALLINT";
case SQL_LONG:
if ( sqlScale < 0 )
return "DECIMAL";
return "INTEGER";
case SQL_INT64:
if ( sqlScale < 0 )
return "DECIMAL";
return "BIGINT";
case SQL_FLOAT:
return "REAL";
case SQL_DOUBLE:
if ( sqlScale < 0 )
return "DECIMAL";
return "DOUBLE PRECISION";
case SQL_QUAD:
return "BIGINT";
case SQL_BLOB:
if (subType == 1)
return "LONG VARCHAR";
return "LONG VARBINARY";
case SQL_TIMESTAMP:
return "TIMESTAMP";
case SQL_TYPE_TIME:
return "TIME";
case SQL_TYPE_DATE:
return "DATE";
case SQL_ARRAY:
return "ARRAY";
default:
NOT_YET_IMPLEMENTED;
}
return "*unknown type*";
}
Best regards
Carlos Guzmán Álvarez
_________________________________________________________________
Envíe y reciba su correo de Hotmail desde el móvil: http://mobile.msn.com
|