Если есть что-то вроде типа данных «по умолчанию» при создании связанной таблицы ODBC в Access, этот тип будет Text(255)
. То есть, если драйвер ODBC сообщает о столбце с типом данных, который Access не поддерживает (например, TIME
в SQL Server), Access включит его как столбец Text(255)
в связанную таблицу.
В этом случае для таблицы PostgreSQL
CREATE TABLE public.numeric_test_table
(
id integer NOT NULL,
text_col character varying(50),
numeric_col numeric,
CONSTRAINT numeric_test_table_pk PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
драйвер ODBC PostgreSQL фактически сообщает, что столбец numeric
имеет значение numeric(28,6)
, что подтверждается вызовом OdbcConnection#GetSchema("columns")
из C#.
![ПолучитьСхему.png](https://i.stack.imgur.com/Au8CU.png)
так что это то, что Access использует в качестве типа столбца для своей связанной таблицы. Только когда Access переходит к извлечению фактических данных, драйвер ODBC PostgreSQL отправляет обратно значения, которые «не подходят» для соответствующего столбца связанной таблицы.
Так что нет, почти наверняка нет общей возможности указать Access обрабатывать все столбцы numeric
(т. е. Decimal
) как Double
. «Лучшим» решением было бы изменить определения таблиц PostgreSQL, чтобы явно указать точность и масштаб, как это предлагается в документе документация PostgreSQL:
Если вас беспокоит переносимость, всегда явно указывайте точность и масштаб [числового столбца].
Если изменение базы данных PostgreSQL невозможно, другим вариантом может быть использование сквозного запроса в Access для явного преобразования столбца в Double
...
SELECT id, text_col, numeric_col::double precision FROM public.numeric_test_table
... имея в виду, что сквозные запросы всегда возвращают наборы записей, доступные только для чтения.
05.12.2016