17.4.ODBC to Jet Data Type Mapping

17.4.1.Overview

When linking to a remote table, Microsoft Jet calls the ODBC SQLColumns function to gather information on the fields in the table. The information returned by SQLColumns determines how the data type of each field will be mapped to a Microsoft Jet data type.

Jet uses the fSqlType, lPrecision, and wScale values to determine an appropriate local data type, on a field-by-field basis, and uses that data type to represent the remote data in a linked table. Each time Microsoft Jet executes an action or parameter query against the remote data source, the information stored in the linked table is used to ensure that ODBC calls are made with a valid ODBC data type.

The Jet Engine's mapping of the ODBC SQL_DECIMAL and SQL_NUMERIC types is detailed below. The mapping of these column types is problematic when the precision of a column is greater than 15. Under these circumstances Jet maps the column to the Jet Text type. This is done so as not to lose precision, since the maximum precision of the Jet numeric types is 15. An unfortunate consequence of mapping to the Text type is that the data is no longer recognised as being numeric.

To overcome this limitation, the Jetfix switch (+jetfix) changes the ODBC type returned by SQLColumns for native database column types which would normally be reported as SQL_DECIMAL or SQL_NUMERIC. These might, for example, be MONEY, DECIMAL or NUMERIC columns in the remote table. With Jetfix enabled, these columns are typically reported as SQL_DOUBLE; which Jet always maps to Number (Double). As a result, Jet recognises the data as numeric, albeit with a possible loss of precision, depending on the actual data values.

17.4.2.ODBC to Jet Data Type Mapping

Table17.14.ODBC to Jet Data Type Mapping performed by Jet Engine

ODBC Data Type Jet Data Type Notes
Type Precision p Scale s

SQL_DECIMAL

SQL_NUMERIC

p <= 4 s = 0 Number (Integer)
p <= 9 s = 0 Number (Long Integer)
p <= 15 0 <= s <=4 Number (Double)
p <= 15? s > 4 Number (Double) "ODBC to Jet Data Type Mapping" document unclear here.
p = 19 s = 4 Currency MS SQL Server only
p = 10 s = 4 Currency MS SQL Server only
p > 15 s irrelevant Text Not documented. Based on testing.

The Jet Data Type is a property setting available in the table Design view.

17.4.3.Jet Data Type Ranges

Table17.15.Jet Data Type Ranges

Jet Data Type Range
Integer – 32,768 … 32,767
Long Integer – 2,147,483,648 … 2,147,483,647
Double -1.8E+308 … -1.8E-308, 1.8E-308 … 1.8E+308
Currency – 922,337,203,685,477.5808 … 922,337,203,685,477.5807

17.4.4.References

See the following articles from Microsoft:

  • Knowledge base article KB214854, "Improved ODBC DataType Mappings with Jet 4.0" on the Microsoft Support Website .

  • See Chapter 9 "Developing Client/Server Application" of Microsoft Jet Database Engine Programmer's Guide, Second Edition. Redmond, WA: Microsoft Press, 1997.

17.4.5.Informix Jet Support

Informix Jetfix Testing

To verify the effect of the +jetfix switch, two tables were created and then linked to from Access, once with +jetfix enabled, and once with +jetfix disabled. The first table contained five MONEY columns of various precisions and scales. The second table was identical except that it used DECIMAL instead of MONEY columns. The resulting Jet data type mappings as shown in the 'Table Design' view are detailed below:

Table17.16.Informix ODBC to Jet Data Type Mapping

Informix table definition:

create table CBTEST (<column defs>)

Jet Type Mappings
Jetfix off Jetfix on
col1 {MONEY| DECIMAL} (14, 4) Number (Double) Number (Double)
col2 {MONEY| DECIMAL} (14, 5) Number (Double) Number (Double)
col3 {MONEY| DECIMAL} (16, 0) Text Number (Double)
col4 {MONEY| DECIMAL} (16, 4) Text Number (Double)
col5 {MONEY| DECIMAL} (16, 5) Text Number (Double)

OpenLink Informix Agent – Numeric Data type Mappings

The following table details how the Informix agent fetches numeric data from Informix. The SQL type reported for a SELECT column varies depending on the native Informix type of the column, and its precision and scale. The OpenLink C type used to fetch the data is also shown, together with the effect of the JetFix command line switch.

Changes to the type mappings required to implement the +jetfix option are shown in italics.

Table17.17.Informix Agent – Numeric Data type Mappings

Informix Type Scale (s)

Decimal Precision (p)

Range (r)

JetFix SQL Type

OpenLink Fetch Type

CTYPE_xxx

FLOAT [(n)] {1}

Synonyms:

DOUBLE PRECISION

NA

p <= 16

r = 1.7E308 (15 digits precision)

NA SQL_DOUBLE FLT64

DECIMAL

DECIMAL (p)

DECIMAL (p,s)

Synonyms:

NUMERIC

NA

NA

p = 16

p <= 32

p <= 32

r = 1E+124 … 1E-130 ..

OFF SQL_DECIMAL VCHR
ON SQL_DOUBLE FLT64 {2}

INTEGER

Synonymns:

INT

s = 0

p <= 9

r = -2,147,483,648 to +2,147,483,647

NA SQL_INTEGER SGN32

MONEY

MONEY(p)

MONEY (p,s)

s = 2

s = 2

p = 16

p <= 32

p <=32

r = 1E(p-s) - 1E(-s)

OFF SQL_DECIMAL VCHR
ON SQL_DOUBLE FLT64 {2}

SMALLFLOAT

Synonyms:

REAL

NA r =3.4E38 NA SQL_REAL FLT32
SMALLINT s = 0

p = 5

r = -32,768 to +32,767

NA SQL_SMALLINT SGN16

  • {1} Informix SQL ignores the specified float precision.

  • {2} Possible loss of precision.

Precision of OpenLink C Types

The choice of OpenLink C type used to fetch a numeric value is determined by the maximum precision supported by the type. If a numeric type exists which can represent the data to be fetched, without loss of precision, then this is used as the preferred fetch type. If a numeric type capable of supporting the required precision does not exist, then the data is fetched in character form, unless the JetFix switch is on. In this case, the data is fetched using the CTYPE_FLT64 fetch type. This type has sufficient range to store the maximum numeric values supported by Informix, but its use may result in a loss of precision, if the precision of the data to be fetched exceeds 15 decimal digits.

Table17.18.Precision of OpenLink C Types

OpenLink C Type CTYPE_xxx Equivalent built in C type (32bit processor) Range Can hold all numbers of precision <= p decimal digits
SGN8 signed char -128…127 p = 2
SGN16 short -32768…32767 p = 4
FLT32 float 3.4E38 (6 digits precision) p = 6
SGN32 long -2,147,483,648…2,147,483,647 p = 9
FLT64 double 1.7 E308 (15 digits precision) p = 15

17.4.6.Oracle Jet Support

OpenLink Oracle Agent – Numeric Data type Mappings

The following table details how the Oracle agent fetches numeric data from Oracle. The SQL type reported for a SELECT column varies depending on the native Oracle type of the column, and its precision and scale. The OpenLink C type used to fetch the data is also shown, together with the effect of the JetFix command line switch.

Changes to the type mappings are shown in the table as italics.

Table17.19.Informix ODBC to Jet Data Type Mapping

Oracle Type Scale (s) Decimal Precision (p) JetFix SQL Type OpenLink Fetch Type CTYPE_xxx
FLOAT (b) NA

p <= 15

(b <= 50) {1}

NA SQL_DOUBLE FLT64

15 < p < 38

(50 < b < 126)

ON SQL_DOUBLE FLT64 {2}
OFF SQL_DECIMAL VCHR16
FLOAT {3} , NUMBER {4} NA p = 38 ON SQL_DOUBLE FLT64 {2}
OFF SQL_DECIMAL VCHR16
NUMBER (p,s) s <> 0 p <= 15 ON SQL_DOUBLE FLT64
OFF SQL_DECIMAL VCHR16
p > 15 ON

SQL_DECIMAL

SQL_DOUBLE

VCHR16

FLT64 {2}?

OFF SQL_DECIMAL VCHR16
Calculated field s = 0 p = 0 {5} ON SQL_DOUBLE FLT64
OFF SQL_DECIMAL VCHR16
NUMBER (p) s = 0 0 < p <= 2 NA SQL_TINYINT SGN8
2 < p <= 4 NA SQL_SMALLINT SGN16
4 < p <= 9 NA SQL_INTEGER SGN32
9 < p <= 15 ON SQL_DOUBLE

VCHR16

FLT64

OFF

SQL_DOUBLE

SQL_DECIMAL

VCHR16
15 < p <= 38 {6} ON SQL_DOUBLE FLT64 {2}
OFF SQL_DECIMAL VCHR16

{Notes}:

  • FLOAT(b) specifies a floating point number with binary precision b. The precision can range from 1 to 126. To convert from binary to decimal precision, multiply b by 0.30103.

  • Possible loss of precision

  • FLOAT specifies a floating point number with decimal precision 38, or a binary precision of 126.

  • NUMBER specifies a floating point number with decimal precision = 38.

  • Oracle appears to return s=0, p=0 for a calculated field

  • Oracle permits a maximum precision of 38.

Precision of OpenLink C Types

The choice of OpenLink C type used to fetch a numeric value is determined by the maximum precision supported by the type. If a numeric type exists which can represent the data to be fetched, without loss of precision, then this is used as the preferred fetch type. If a numeric type capable of supporting the required precision does not exist, then the data is fetched in character form, unless the JetFix switch is on. In this case, the data is fetched using the CTYPE_FLT64 fetch type. This type has sufficient range to store the maximum numeric values supported by Oracle, but its use may result in a loss of precision, if the precision of the data to be fetched exceeds 15 decimal digits.

Table17.20.Precision of OpenLink Oracle C Types

OpenLink C Type CTYPE_xxx Equivalent built in C type (32 bit processor) Range Can hold all numbers of precision <= p decimal digits
SGN8 signed char -128…127 p = 2
SGN16 short -32768…32767 p = 4
SGN32 long -2,147,483,648…2,147,483,647 p = 9
FLT64 double 1.7 E308 (15 digits precision) p = 15