I try to read numeric/decimal/money columns from SQL Server via ODBC in the following manner:
SQL_NUMERIC_STRUCT decimal;
SQLGetData(hSqlStmt, iCol, SQL_C_NUMERIC, &decimal, sizeof(decimal), &indicator);
All these types are returned as SQL_NUMERIC_STRUCT structure, and I specify the SQL_C_NUMERIC type to SQLGetData() API.
In the database, column is defined as decimal(18, 4)
for example, or money
. But the problem is that the returned data has decimal.precision
always set to 38 (max possible value) and decimal.scale
always set to zero. So if the actual stored number is 12.65, the returned value in SQL_NUMERIC_STRUCT structure is equal to 12. So the fractional part is simply discarded, for a very strange reason.
What can I be doing wrong?
OK, this article explains the problem. The solution is so cumbersome, that I decided to avoid using
SQL_NUMERIC_STRUCT
altogether, influenced by this post. Now I specifySQL_C_WCHAR
(SQL_C_CHAR
would do as well) and read the numeric/decimal/money columns as text strings directly. Looks like the driver does the conversion.