mirror of
https://github.com/pocoproject/poco.git
synced 2025-04-01 09:24:55 +02:00
fixed GH #2807: Poco::Data::ODBC Binding of SQL Decimal Type
This commit is contained in:
parent
d658cc25e7
commit
c15b6191b6
@ -21,14 +21,14 @@ namespace Data {
|
|||||||
namespace ODBC {
|
namespace ODBC {
|
||||||
|
|
||||||
|
|
||||||
ODBCMetaColumn::ODBCMetaColumn(const StatementHandle& rStmt, std::size_t position) :
|
ODBCMetaColumn::ODBCMetaColumn(const StatementHandle& rStmt, std::size_t position) :
|
||||||
MetaColumn(position),
|
MetaColumn(position),
|
||||||
_rStmt(rStmt)
|
_rStmt(rStmt)
|
||||||
{
|
{
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ODBCMetaColumn::~ODBCMetaColumn()
|
ODBCMetaColumn::~ODBCMetaColumn()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -43,14 +43,14 @@ void ODBCMetaColumn::getDescription()
|
|||||||
_columnDesc.decimalDigits = 0;
|
_columnDesc.decimalDigits = 0;
|
||||||
_columnDesc.isNullable = 0;
|
_columnDesc.isNullable = 0;
|
||||||
|
|
||||||
if (Utility::isError(Poco::Data::ODBC::SQLDescribeCol(_rStmt,
|
if (Utility::isError(Poco::Data::ODBC::SQLDescribeCol(_rStmt,
|
||||||
(SQLUSMALLINT) position() + 1, // ODBC columns are 1-based
|
(SQLUSMALLINT) position() + 1, // ODBC columns are 1-based
|
||||||
_columnDesc.name,
|
_columnDesc.name,
|
||||||
NAME_BUFFER_LENGTH,
|
NAME_BUFFER_LENGTH,
|
||||||
&_columnDesc.nameBufferLength,
|
&_columnDesc.nameBufferLength,
|
||||||
&_columnDesc.dataType,
|
&_columnDesc.dataType,
|
||||||
&_columnDesc.size,
|
&_columnDesc.size,
|
||||||
&_columnDesc.decimalDigits,
|
&_columnDesc.decimalDigits,
|
||||||
&_columnDesc.isNullable)))
|
&_columnDesc.isNullable)))
|
||||||
{
|
{
|
||||||
throw StatementException(_rStmt);
|
throw StatementException(_rStmt);
|
||||||
@ -136,29 +136,38 @@ void ODBCMetaColumn::init()
|
|||||||
case SQL_DECIMAL:
|
case SQL_DECIMAL:
|
||||||
// Oracle has no INTEGER type - it's essentially NUMBER with 38 whole and
|
// Oracle has no INTEGER type - it's essentially NUMBER with 38 whole and
|
||||||
// 0 fractional digits. It also does not recognize SQL_BIGINT type,
|
// 0 fractional digits. It also does not recognize SQL_BIGINT type,
|
||||||
// so the workaround here is to hardcode it to 32 bit integer
|
// so the workaround here is to hardcode it to 32 or 64 bit integer
|
||||||
if (0 == _columnDesc.decimalDigits) setType(MetaColumn::FDT_INT32);
|
if (0 == _columnDesc.decimalDigits)
|
||||||
else setType(MetaColumn::FDT_DOUBLE);
|
{
|
||||||
|
if (_columnDesc.size > 9)
|
||||||
|
setType(MetaColumn::FDT_INT64);
|
||||||
|
else
|
||||||
|
setType(MetaColumn::FDT_INT32);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setType(MetaColumn::FDT_DOUBLE);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SQL_REAL:
|
case SQL_REAL:
|
||||||
setType(MetaColumn::FDT_FLOAT); break;
|
setType(MetaColumn::FDT_FLOAT); break;
|
||||||
|
|
||||||
case SQL_BINARY:
|
case SQL_BINARY:
|
||||||
case SQL_VARBINARY:
|
case SQL_VARBINARY:
|
||||||
case SQL_LONGVARBINARY:
|
case SQL_LONGVARBINARY:
|
||||||
case -98:// IBM DB2 non-standard type
|
case -98:// IBM DB2 non-standard type
|
||||||
setType(MetaColumn::FDT_BLOB); break;
|
setType(MetaColumn::FDT_BLOB); break;
|
||||||
|
|
||||||
case SQL_TYPE_DATE:
|
case SQL_TYPE_DATE:
|
||||||
setType(MetaColumn::FDT_DATE); break;
|
setType(MetaColumn::FDT_DATE); break;
|
||||||
|
|
||||||
case SQL_TYPE_TIME:
|
case SQL_TYPE_TIME:
|
||||||
setType(MetaColumn::FDT_TIME); break;
|
setType(MetaColumn::FDT_TIME); break;
|
||||||
|
|
||||||
case SQL_TYPE_TIMESTAMP:
|
case SQL_TYPE_TIMESTAMP:
|
||||||
setType(MetaColumn::FDT_TIMESTAMP); break;
|
setType(MetaColumn::FDT_TIMESTAMP); break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
throw DataFormatException("Unsupported data type.");
|
throw DataFormatException("Unsupported data type.");
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user