2011-04-05 46 views
2

我正在遷移訪問2003應用程序以訪問2010.該應用程序使用postgres odbc驅動程序來訪問其數據。爲什麼訪問2010 postgresql odbc驅動程序調用IDENT_CURRENT?

訪問2010時,它嘗試在postgresql服務器上使用IDENT_CURRENT函數(如wireshark所示)來標識最近插入的行的ID ...不幸的是,IDENT_CURRENT不是由postgresql支持的功能,據我所知...

我正在使用postgresql 8.3數據庫的最新postgresql ODBC驅動程序(9.0)。

+1

我能夠通過教我們的表格(主鍵始終存儲在名爲

_id的列中)的todo IDENT_CURRENT如何解決我的特殊問題,但這不是一個真正的我認爲不錯的解決方案。 CREATE FUNCTION IDENT_CURRENT(name)返回BIGINT AS $$ SELECT CURRVAL( REGEXP_REPLACE( $ 1, 」 +公共[。 「] +([^」] +)「? 'E' \\ 1_ \ \ 1_id_seq' ); ); $$ LANGUAGE SQL; – 2011-04-05 14:18:02

回答

1

使用currval是正確的方式去(重點煤礦):

返回最近一次nextval該序列在當前會話中所獲得的價值。 (如果nextval從未在此會話中被調用過此序列,則會報告錯誤。)由於此正在返回會話本地值,因此會給出可預測的答案,因爲當前會話是否其他會話已執行nextval

並將其封裝在IDENT_CURRENT函數中是一種完全合理的移植技術。

你也可以用你的INSERT語句(再次,重點煤礦)​​:

可選RETURNING子句使INSERT來計算,並根據每行返回值(一個或多個)實際上插入。這主要用於獲取默認值提供的值,例如串行序列號

這可能會更快更乾淨,但仍然會有一些可移植性問題。 OTOH,我認爲無論你做什麼,你都會遇到可移植性問題。

+0

我知道如何解決sql級別上的問題,我只是想知道爲什麼M $ Access 2010與Postgresql ODBC嘗試使用M $ SQL服務器命令在postgresql數據庫上......運行在Access 2003上的同一個數據庫不會出現這個問題 – 2011-04-06 15:26:05

+0

@Tobi:它是Access,ODBC,PostgreSQL ODBC驅動程序還是你試圖使用'IDENT_CURRENT'的應用程序。認爲很多人使用Access和ODBC與PostgreSQL,所以我猜猜問題是更糟的在你的應用程序中,但我可能是錯的。 – 2011-04-06 17:07:16

+0

它是以一種相當複雜的形式(一種嵌入另一種形式)訪問......應用程序在acccess 2003和8.4 odbc驅動程序中正常工作......當使用9.0 odbc驅動程序切換到2010年時,奇怪的行爲開始了。 .. – 2011-04-07 20:08:02