为啥使用 postgresql odbc 驱动程序调用 IDENT_CURRENT 访问 2010?

Posted

技术标签:

【中文标题】为啥使用 postgresql odbc 驱动程序调用 IDENT_CURRENT 访问 2010?【英文标题】:why does access 2010 with postgresql odbc driver call IDENT_CURRENT?为什么使用 postgresql odbc 驱动程序调用 IDENT_CURRENT 访问 2010? 【发布时间】:2011-04-05 13:52:23 【问题描述】:

我正在将 access 2003 应用程序迁移到 access 2010。该应用程序使用 postgres odbc 驱动程序来访问其数据。

在访问 2010 时,它尝试使用 postgresql 服务器上的 IDENT_CURRENT 函数(如使用 wireshark 所见)来识别最近插入的行的 id ......不幸的是,据我所知 IDENT_CURRENT 不是 postgresql 支持的函数。 ..

我正在使用最新的 postgresql ODBC 驱动程序 (9.0) 和 postgresql 8.3 数据库。

【问题讨论】:

我能够通过教 postgres 如何为我们的表执行 IDENT_CURRENT 来解决我的特定问题(其中主键始终存储在名为 _id 的列中)但这并不是真正的我认为很好的解决方案。 CREATE FUNCTION IDENT_CURRENT(name) RETURNS BIGINT AS $$ SELECT CURRVAL( regexp_replace( $1, '.+public[."]+([^"]+)"?',E'\\1_\\1_id_seq' ) ); $$ 语言 SQL;
【参考方案1】:

使用currval 是正确的方法(强调我的):

返回nextval 在当前会话中为此序列最近获得的值。 (如果在此会话中从未为此序列调用过nextval,则会报告错误。)因为此正在返回会话本地值,所以无论其他会话是否已执行,它都会给出可预测的答案 nextval,因为当前会话完成了。

将其封装在 IDENT_CURRENT 函数中是一种非常合理的移植技术。

您也可以在您的 INSERT 语句中使用 RETURNING id(再次强调我的):

可选的RETURNING 子句使INSERT 根据实际插入的每一行计算并返回值。这主要用于获取默认提供的值,例如序列号

这可能会更快更简洁,但您仍然会遇到一些可移植性问题。 OTOH,我认为无论您做什么,都会遇到可移植性问题。

【讨论】:

我知道如何在 sql 级别解决问题,我只是想知道为什么带有 Postgresql ODBC 的 M$ Access 2010 尝试在 postgresql 数据库上使用 M$ SQL 服务器命令...在 Access 2003 上运行的同一数据库不会出现此问题。 @Tobi:是 Access、ODBC、PostgreSQL ODBC 驱动程序还是您的应用程序正在尝试使用IDENT_CURRENT。你会认为很多人在 PostgreSQL 中使用 Access 和 ODBC,所以我猜问题出在你的应用程序的某个地方,但我可能是错的。 它是访问...具有相当复杂的形式(一个嵌入在另一个中)...该应用程序在访问 2003 和 8.4 odbc 驱动程序下工作正常...切换到时奇怪的行为开始2010 带有 9.0 odbc 驱动程序... @Tobi:对不起,我对 Access 了解不多(对我有好处,对你没有好处)。从好的方面来说,你有一个工作组合。不利的一面是,杂物就是杂物。我为您添加了几个 Access 标签,希望它们能引起对 Access 有所了解的人的注意。 我认为更多的人会使用 PostgreSQL 和 Access,但在我看来,在 SQL Server 之后,Oracle 和 mysql 是最常见的。长期以来,我一直是 PostgreSQL 的粉丝,因为它早在 MySQL 之前就已经成熟为一个成熟的数据库(当 MySQL 还是一个没有引擎级外键约束的玩具时,PostgreSQL 就已经成熟了!)。但不幸的是,我从来没有机会使用它。

以上是关于为啥使用 postgresql odbc 驱动程序调用 IDENT_CURRENT 访问 2010?的主要内容,如果未能解决你的问题,请参考以下文章

使用 MS Access 和 ODBC 连接到远程 PostgreSQL

通过ODBC将Excel连接到PostgreSQL

我可以将 MS Access 应用程序链接到 Linux 服务器上的 Postgresql 吗?可以/我应该使用 ODBC 吗?

通过 Windows ODBC PostgreSQL 驱动程序连接到 HSQLDB 2.5

为啥 vsql 可以返回所有记录,而使用 ODBC 驱动程序不能?

Windows 7 上的 PostgreSQL ODBC 驱动程序未显示