为啥使用 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 来解决我的特定问题(其中主键始终存储在名为使用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
我可以将 MS Access 应用程序链接到 Linux 服务器上的 Postgresql 吗?可以/我应该使用 ODBC 吗?
通过 Windows ODBC PostgreSQL 驱动程序连接到 HSQLDB 2.5