| 发表于:2007-05-22 13:33:5211楼 得分:0 |
网上找来的,你可以试一下 自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 | | |
|