Delphi中操做ADO訪問Access數據庫時獲取新插入記錄的自動編號

 

獲取新插入記錄的自動編號 在網上搜索自動編號,能夠看到不少文章,而絕大多數的文章都是引用的一樣的幾篇文章,而這些文章的最終來源,仍是來自微軟的Support,若是你不想
看我在這裏班門弄斧,盡能夠直接來參考如下幾篇文章。個人參考資料也是來自這幾篇文章:
233299 (http://support.microsoft.com/kb/233299/EN-US/) INFO: Identity and Auto-Increment Fields in ADO 2.1 and Beyond
232144 (http://support.microsoft.com/kb/232144/EN-US/) INFO: Jet OLE DB Provider Supports SELECT @@Identity
190370 (http://support.microsoft.com/kb/190370/EN-US/) PRB: AutoNumber Field Is Not Incremented When Using ADO
221931 (http://support.microsoft.com/kb/221931/EN-US/) HOWTO: Return Record's Autonumber Value Inserted into Access DB
網上的中文資料是熱心網友據此總結出來的,獲取自動編號,最經常使用的兩種方法由access911.net的cg1兄弟整理,其方法就是來自上面的四篇Support中,下面我寫出的例程和他的是一致的。
總結一下就是,自Jet4.0之後,Jet提供了對"SELECT @@Identity"這條語句的支持,咱們通常在數據庫中插入記錄有兩種方法,其一是使用AddNew和Update,其二是使用Insert Into語句。數據庫

 

一、Insert Into語句後,如何取自動編號的值,請看例程:

 

1 cnn.execute "INSERT INTO Goods (Name,Description) Values ('新商品1','新商品描述1')"
2 dim rst as adodb.recordset
3 set rst=new adodb.recordset
4 rst.open "SELECT @@Identity"
5 msgbox rst(0) 
這裏rst(0)即爲新記錄的自動編號字段的值

二、AddNew和Update執行後,如何取自動編號的值,請看例程:

1 rst.addnew
2 rst.fields("Name")="新商品1"
3 rst.fields("Description")="新商品描述1"
4 rst.update
5 msgbox rst.fields("ID")

 

rst.fields("ID")即爲新記錄的自動編號字段的值,注意,ID是我在Goods表中設計的自動編號列名。
下 面說說其中涉及到的一些知識,Jet4.0之後支持SELECT @@Identity語句,這條語句執行後會返回執行這條語句的connection對象最近一次插入的記錄中的自動編號字段的值。當使用Update方 法時,Jet引擎自動把它轉換成Insert語句,而且還要自動調用一次SELECT @@Identity查詢,這就是爲何在Update後,不須要使用SELECT @@Identity就能夠直接得到自動編號的值的緣由。ide

值得注意的是,插入操做和執行SELECT @@Identity的操做所使用的connection對象應該是同一個對象。測試

其實這就是微軟給出的方法,我爲何還要在這裏再囉嗦一次呢,緣由是,我在測試上面的兩個方法時,update能夠,但Insert那個方法老是獲得0。我很疑惑,仔細看了例程後,發現例程中的數據庫是使用ADOX的Catalog對象建立的,其方法是:
cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\NewJet4.MDB;"spa

要 知道,若是使用上面的語句建立出來的數據庫實際上是Access2000格式的,而我經常喜歡在VisData中操做數據庫,VisData建立的數據庫是 Access95格式的,而在微軟Support中提到了,對SELECT @@Identity語句的支持是在Access2000後才獲得提供的,這就是我測試通不過的緣由。.net

另外對於使用VisData或者 Access95格式的數據庫,使用上面提到的第2種方法獲取自動編號的值有時正常,有時卻返回0,這要看數據庫更新的速度了,若是數據庫沒來得及更新, 你就查詢自動編號字段的值,獲得的就會是0了,因此說,對於Access95格式的數據庫來講,這種方法是存在隱患的。更直接的說,我和你都應該拋棄 VisData和Access95了。
另外再說一點題外話,使用ADOX建立Access95格式,也就是VisData能夠打開的數據庫的方法是:
cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\NewJet4.MDB;Extended properties='Jet 3.x';"
這裏針對使用Access95格式數據庫的兄弟再提供一個辦法,也是上面的Support中提過的,那就是使用Bookmark和AbsolutePosition,請看例程:設計

三、使用Access95格式數據庫如何獲取新插入記錄的自動編號的值:

1 rst.addnew
2 rst.fields("Name")="新商品1"
3 rst.fields("Description")="新商品描述1"
4 rst.update
5 dim bookmark '這裏bookmark應該是Variant類型
6 bookmark = rst.AbsolutePosition
7 rst.Requery '這是一個重點
8 rst.AbsolutePosition = bookmark
9 msgbox rst.fields("ID")

 

'這裏rst.fields("ID")即爲新記錄的自動編號字段的值。
在這裏,bookmark標識了新記錄在rst的物理行位置,Requery使rst獲得更新,而後經過bookmark使rst的遊標指向新記錄,這種方法對於Access95和
Access2000的數據庫都適用,它的缺點就是,你必需要Requery,而有時咱們的代碼可能不想這樣。
另外,方法1和方法2和方法3對於SQL SERVER來講也是同樣能夠正常使用的,只要你肯定Jet的版本等於4.0。
再說一句題外話,如何肯定Jet版本呢,一樣來自Support,請看例程:code

 

1 If cnn.Properties("Jet OLEDB:Engine Type").Value = 5 Then
2 MsgBox "Jet 4.0 database"
3 Else
4 MsgBox "Not a Jet 4.0 database"
5 End If

 

若是你對Jet有着濃厚的興趣,能夠經過下面的連接來找到一些信息:
如何獲取 Microsoft Jet 4.0 數據庫引擎的最新 Service Pack:
http://support.microsoft.com/default.aspx?scid=kb;zh-cn;239114#XSLTH3135121123120121120120
下面是有關MDAC的連接:
http://support.microsoft.com/default.aspx?scid=fh;ZH-CN;mdac 對象

相關文章
相關標籤/搜索