网上找来的
自Jet4.0以后,Jet提供了对"SELECT @@Identity"这条语句的支持,我们一般在数据库中插入记录有两种方法,其一是使用AddNew和Update,其二是使用Insert Into语句。
1、Insert Into语句后,如何取自动编号的值,请看例程:
cnn.execute "INSERT INTO Goods (Name,Description) Values ('新商品1','新商品描述1')"
dim rst as adodb.recordset
set rst=new adodb.recordset
rst.open "SELECT @@Identity"
msgbox rst(0) '这里rst(0)即为新记录的自动编号字段的值
2、AddNew和Update执行后,如何取自动编号的值,请看例程:
rst.addnew
rst.fields("Name")="新商品1"
rst.fields("Description")="新商品描述1"
rst.update
msgbox rst.fields("ID") '这里rst.fields("ID")即为新记录的自动编号字段的值,注意,ID是我在Goods表中设计的自动编号列名。
下 面说说其中涉及到的一些知识,Jet4.0以后支持SELECT @@Identity语句,这条语句执行后会返回执行这条语句的connection对象最近一次插入的记录中的自动编号字段的值。当使用Update方 法时,Jet引擎自动把它转换成Insert语句,并且还要自动调用一次SELECT @@Identity查询,这就是为什么在Update后,不需要使用SELECT @@Identity就可以直接获得自动编号的值的原因。
值得注意的是,插入操作和执行SELECT @@Identity的操作所使用的connection对象应该是同一个对象。
其实这就是微软给出的方法,我为什么还要在这里再啰嗦一次呢,原因是,我在测试上面的两个方法时,update可以,但Insert那个方法总是得到0。我很疑惑,仔细看了例程后,发现例程中的数据库是使用ADOX的Catalog对象创建的,其方法是:
cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\NewJet4.MDB;"
要 知道,如果使用上面的语句创建出来的数据库其实是Access2000格式的,而我常常喜欢在VisData中操作数据库,VisData创建的数据库是 Access95格式的,而在微软Support中提到了,对SELECT @@Identity语句的支持是在Access2000后才得到提供的,这就是我测试通不过的原因。
另外对于使用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,请看例程:
3、使用Access95格式数据库如何获取新插入记录的自动编号的值:
rst.addnew
rst.fields("Name")="新商品1"
rst.fields("Description")="新商品描述1"
rst.update
dim bookmark '这里bookmark应该是Variant类型
bookmark = rst.AbsolutePosition
rst.Requery '这是一个重点
rst.AbsolutePosition = bookmark
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,请看例程:
If cnn.Properties("Jet OLEDB:Engine Type").Value = 5 Then
MsgBox "Jet 4.0 database"
Else
MsgBox "Not a Jet 4.0 database"
End If
努力加载评论中...
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步