You see an error if you do not specify the precision and scale using the ODBC API method – SQLSetDescField – when retrieving data from numeric or decimal columns in a table.
Workaround: Specify the SQLSetDescField with value types SQL_DESC_PRECISION and SQL_DESC_SCALE.
This code illustrates how to retrieve a numeric column from a table specifying a precision and scale.
/*
Insert values
Execute select statement
*/
/*
Fetch Values
*/
#define ROW_SIZE 10
SQLRETURN sr;
SQL_NUMERIC_STRUCT g[ROW_SIZE];
SQLLEN gLen[ROW_SIZE];
SQLINTEGER intVal[ROW_SIZE];
SQLLEN intLen[ROW_SIZE];;
sr = SQLBindCol(hStmt, 1, SQL_C_LONG, intVal, sizeof(SQLINTEGER), intLen);
sr = SQLBindCol(hStmt, 2, SQL_C_NUMERIC, g, sizeof(SQL_NUMERIC_STRUCT), gLen);
SQLHDESC hdesc = NULL;
SQLGetStmtAttr(hStmt, SQL_ATTR_APP_ROW_DESC, &hdesc, 0, NULL);
SQLSetDescField(hdesc, 2, SQL_DESC_PRECISION, SQLPOINTER) 5, 0);
SQLSetDescField(hdesc, 2, SQL_DESC_SCALE, (SQLPOINTER) 2, 0);
SQLUSMALLINT rowStatus[ROW_SIZE];
sr = SQLSetStmtAttr(hStmt, SQL_ATTR_ROW_STATUS_PTR, rowStatus, 0);
for (short i = 0; i < ROW_SIZE; i++)
{
memset(&g[i], '\0', sizeof(SQL_NUMERIC_STRUCT));
memset(g[i].val, 0, 16);
}
sr = SQLFetch(StatementHandle);
See the Microsoft ODBC API Reference.