我有一个postgresql数据库。在某些表格中,列有money
类型的列。
我想使用MS Access
作为前端。
但是在使用postgres odbc驱动程序链接MS Access中的表时,money类型的列的值都为0.尝试更新值时会显示错误:
operator does not exist: money = double precision
链接表格中的数据类型为NUMBER (FieldSize = DOUBLE)
,无法更改为货币。
我不想将postgres中的数据类型从money更改为numeric。 (但也许,我必须?)
希望有人可以提供帮助。
感谢。
答案 0 :(得分:0)
尝试将其转换为数字:
# select 2::double precision::money;
ERROR: cannot cast type double precision to money
LINE 1: select 2.0::double precision::money;
^
# select 2::double precision::numeric::money;
money
-------
$2.00
(1 row)
# select 2::money::double precision;
ERROR: cannot cast type money to double precision
LINE 1: select 2::money::double precision;
^
# select 2::money::numeric::double precision;
float8
--------
2
(1 row)
答案 1 :(得分:0)
我可以重新创建问题(至少部分地),它肯定是Access用户界面,Access数据库引擎和PostgreSQL ODBC驱动程序之间的一些奇怪的交互。我有一个名为[public_table1]的Access链接表,它链接到PostgreSQL表
CREATE TABLE table1
(
id serial NOT NULL,
customer character varying(255),
balance money,
CONSTRAINT pk_table1 PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
ALTER TABLE table1
OWNER TO postgres;
GRANT ALL ON TABLE table1 TO postgres;
GRANT ALL ON TABLE table1 TO public;
我可以在数据表视图中打开链接表,但我确实看到[balance]值,但我无法编辑它们(与您的错误相同)。如果我使用Access查询构建器来构建像这样的更新查询......
UPDATE public_table1 SET public_table1.balance = 2.22
WHERE (((public_table1.[id])=4));
......我也得到了错误。但是,以下VBA语句可以正常工作:
Sub pgTest()
CurrentDb.Execute "UPDATE public_table1 SET balance=6.78 WHERE id=4", dbFailOnError
End Sub
所以,至少在我的情况下,似乎我可以使用数据表和绑定表单来查看 PostgreSQL数据,但不能更改它。不幸的是,这种限制可能会大大降低使用Access作为前端的好处(取决于您打算执行哪种操作)。
答案 2 :(得分:0)
不幸的是,我认为最好的方法是将PostgreSQL中的列数据类型更改为数字。好消息是你可以在不失去精度的情况下转换列。
我已经尝试过了,另一种方法是为每个包含货币值的表创建视图,这些货币值将列转换为数字数据类型。然后,您可以定义更新,插入和删除INSTEAD OF触发器以使视图可更新,并将触发器函数中的类型转换回金钱。在这种情况下,PostgreSQL引擎正在进行转换,而不是ODBC驱动程序或Access。虽然这种解决方案有效,但它比仅转换列数据类型更复杂,更脆弱。
上述两种解决方案都可以使您的数据表更新。
顺便说一句,您可以使用CCur(columnname)
将数字转换回访问端的货币。