From: Carlos G.A. <car...@ho...> - 2002-07-30 11:40:57
|
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/NUMERIC FIELDS. 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 Guzman Alvarez P.D.: I already send this post in 19/06/2002, but it´s not included in CVS sources and i want to know if anybody found a problem with the fix..... _________________________________________________________________ MSN Fotos: la forma más fácil de compartir e imprimir fotos. http://photos.msn.es/support/worldwide.aspx |