获取新插入记录的自动编号 在网上搜索自动编号,能够看到不少文章,而绝大多数的文章都是引用的一样的几篇文章,而这些文章的最终来源,仍是来自微软的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语句。数据库
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)即为新记录的自动编号字段的值
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,请看例程:设计
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 对象