VB5在处理数据库时的几个“BUG” ---- VB5在处理数据库方面,提供了强大的功能,但是在笔者的使用过程中,发现了它也存在着一些“BUG”,现在介绍给大家,希望同志们在遇到相似的问题时做个参考。 ---- VB主要处理的是MDB格式的数据库,但就在这方面,它就偏偏出了差错,先看看下例: Dim db As Database Dim rs As Recordset Set db = OpenDatabase(App.Path & "\zzr.mdb") Set rs = db.OpenRecordset("test") Debug.Print rs.RecordCount ---- 此例假设在应用程序目录下有一个名为“zzr.mdb”的数据库,而且它里边有一个名为“test”的表,此程序的目的就是求出该表中的记录的总数。此处用到的是“表”对象的RecordCount属性,这样用在一般性况下是正确的,但并不能保证在所有的情况下都能得出正确的结果,比如说表中的数据量很大,或者是数据库受到过什么损害等等。如果碰到这种情况,我们可以换一个角度来处理。请看下面的程序: Dim db As Database Dim rs As Recordset Dim Num As Long Set db = OpenDatabase(App.Path & "\zzr.mdb") Set rs = db.OpenRecordset("test") Num = 0 rs.MoveFirst Do While Not rs.EOF() Num = Num + 1 rs.MoveNext Loop Debug.Print Num ---- 这样,最后得到的Num即为正解结果,这种方法的思路是从表的开始处一直顺序走到结尾,就可以“数”出表中到底有多少条记录。这种方法看起来很笨,但是它却是一个相当准确的方法,大家不防可以试一下。 ---- 另一个“BUG”是当VB在处理大型DBF库(笔者用的库均达到300M以上)时,会出现索引不成功的情况,请看下例: Dim db As Database Dim rs As Recordset Dim Num As Long Set db = OpenDatabase(App.Path & "\zzr.mdb") Set rs = db.OpenRecordset("test") Num = 1001 rs.Index = "BM" rs.Seek "=", Num Do While Not rs.Fields("BM") = Num rs.Edit rs.Fields("BM") = 1002 rs.Update rs.MoveNext Loop ---- 此例还是用的上面的例子中的一个表,并且又多做了一些假定:该表中有一个“部门”字段,字段名为:BM,并且在该字段上有一个名字相同的索引,并且是可以重复的(因为一个部门不只是一个人)。上面程序要做的就是找出所有部门为1001的人,并将1001改为1002,即部门调动。 ---- 理论上,上述方法是完全行的通的,但是当遇到很大的库时,有时(必须强调是有些时候)就会出现修改不完全的情况,很多时候是只把第一条记录做了修改而已。我们在来换一种方法试一下(好在VB提供了多种方法以处理不同的情况),请看下例: Dim db As Database Dim rs As Recordset Dim Num As Long Dim SQL As String Set db = OpenDatabase(App.Path & "\zzr.mdb") Set rs = db.OpenRecordset("test") SQL = "Update test set [bm]=1002 where [bm]=1001" Db.Execute SQL