VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 用程序给标识字段(ID)赋值的一种简单实现方法
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:9116, 日期:2001-03-22
武汉水利电力大学动力系
郑志波 郭巧菊
---- Visual Basic(以下简称VB)的出现,极大简化了以前显得相当复杂的Windows程序编程,只需要极少量的代码,就能实现标准Windows应用程序。VB具有很强的数据库管理功能,利用数据控件和数据库管理窗口,可直接建立或处理Microsoft Access格式的数据库,并提供强大的数据存储和检索功能。同时,Visual Basic还能直接编辑和访问其它外部数据库,如Btrieve、dBASE、FoxPro、Paradox等,这些数据库格式都可以用Visual Basic编辑和处理。

---- 在进行数据库(Database)结构设计时,为数据库管理的方便,我们在很多表(Table)中都会用到一个没有具体实际意义、但可以用来标识每条记录(Record)的字段(Field),不妨设该字段名为“ID”。 由于ID字段是用来唯一标志记录的,各条记录必须保证不能重复,因此,它不能由用户输入。很多程序员在设计时会将该字段定义为Long数据类型,并使其“自动生成字段”(自动累加)属性为真(True),这样当添加一条新记录时,系统就会在该字段上自动输入一个与其它记录不同的值。这种处理方法可以保证每条记录的标识号均不相同,但是对ID字段,系统只是进行简单的处理:计数器加1,添加新记录时,取最大计数值加1作为新记录的标识号,而不会考虑有记录已被删除,给程序跟踪数据库记录的变化会带来一些麻烦。笔者结合自身编程实践,给出一种简单的处理方法,很好的解决了这个问题。下面给出一个具体实例。

---- 新建一个数据库,比如“C:\Test.mdb”,添加名为“测试”的表,并在表中添加两个字段ID、Any,其中ID定义为Long类型数据,并定义为主关键字;Any 定义为Text类型。添加几条记录(如表1-1所示):

ID Any
1 第一
3 第二
4 第三
  表1-1  

---- 激活Visual Basic 开发环境,新建一工程,在缺省窗体代码窗口添加以下代码:

Option Explicit

Private db As Database
Private rec As Recordset

Private Sub Form_Load()
  Dim x As Integer          注释:循环计数器
  Dim intID As Integer      注释:用来作为新记录的 ID 号
  Dim sSql As String
  注释: 为SQL 语句设置文本。
  sSql = "SELECT * FROM [测试] ORDER BY [ID]"
  注释: 打开数据库
  Set db = DBEngine.OpenDatabase("c:\Test.mdb")
  注释: 创建新的记录集对象。
  Set rec = db.OpenRecordset(sSql, dbOpenDynaset)
  ‘记录集非空
    If Not rec.EOF Then       
        rec.MoveLast
        rec.MoveFirst
        For x = 1 To rec.RecordCount Step 1
注释:-------------------------------------------------------+
注释: 获取空余最小 ID 号:
注释:      从 1 开始搜索,若记录计数器 x 不等于 ID 字段值 ,
注释:      则取该序号作为 ID值,并跳出循环,若一直匹配,则取大于
注释:      计数器当前值的最小值作为 ID值
注释:--------------------------------------------------------
            If x < > rec.Fields("ID") Then
                intID = x
                Exit For
            End If
            intID = x + 1
            rec.MoveNext
        Next x
    End If

    With rec
        .AddNew
注释: 记录集为空则 intID 为 0,新记录的 ID 值置为 1
注释: 非空则返回空余最小ID号
        .Fields("ID") = IIf(intID, intID, 1)
        .Fields("Any") = " 新记录" & CStr(intID)
        .Update
        .Bookmark = .LastModified
    End With
‘关闭记录集及数据库
rec.Close
db.Close

End Sub

---- 因为程序中使用了数据库引擎,还需添加对 DAO3.51 的引用。选择VB开发环境“工程”菜单下的“引用”菜单项,弹出“引用”对话框,选中“Microsoft DAO 3.51 Object Library” 即可。

---- 运行该程序,会添加“ID”为 2 的记录(ID号为1 的记录已经存在),关闭程序,然后再次运行程序,程序自动添加“ID”为 5 的记录(ID号为1、2、3、4 的记录均已经存在)。手工删除一条记录,比如ID 为3的记录,再次运行程序,程序会将新记录的ID 号取为3。使用这种处理方法,程序能自动检测出被删除记录的ID 号,并在添加新记录时使用空出的ID号,而不用不断向上累加,给记录处理带来一定的方便。

---- 以上程序在Windows95 系统, Visual Basic 6.0(中文企业版)开发环境调试运行通过。