我正在尝试使用 Vb6 和记事本管理一个非常小的数据库。我将 Random 中的所有记录收集到记事本文件 (.dat) 中。我使用 Get 和 Put 命令来获取我存储的记录并插入最新的记录。现在我想有可能删除我输入的记录(也许是最新的)。我坚持说:
Delete #FileNumber1, LatestRec, MyRec
是获得它的好机会。LatestRec 是最新记录的编号(例如:5 表示第 5 条)。MyRec 是我的记录变量。有什么建议么?
您上面提到的删除语句不适用于随机访问文件。不幸的是,VB6 随机访问文件没有为记录删除提供直接的机制,主要是因为删除会导致其他问题的出现,例如文件收缩(填充空白空间)、碎片(未使用的空白空间)等等。如果您确实需要删除一条记录,您唯一的选择是将所有其他记录复制到一个临时文件中,删除旧文件,然后将临时文件重命名为“原始”名称 - 遗憾的是,这是正确的来自微软。
你可以做的一件事,我承认这并不理想,是在你的随机访问文件中添加一个“已删除”字段,默认为 0,但更改为 true、1 或其他一些相关值,表明该记录不再有效。
您甚至可以编写例程来重用已删除的记录,但如果您对文件语义有这么多的了解,考虑将应用程序迁移到更健壮的数据库环境(如 SQL Server)可能会更好。
*编辑: *这是一个非常粗略/粗略/未经测试的示例 VB6 代码块,它显示了如何使用我上面描述的“已删除字段”概念删除/添加记录..警告可能需要进行调整才能获得此代码完美,但重点是为您说明这个概念:
Type SampleRecord
UserID As Long
lastName As String * 25
firstName As String * 25
Deleted As Boolean
End Type
' This logically deletes a record by setting
' its "Deleted" member to True
Sub DeleteRecord(recordId As Long)
Dim targetRecord As SampleRecord
Dim fileNumber As Integer
fileNumber = FreeFile
Open "SampleFile" For Random As fileNumber Len = LenB(SampleRecord)
Get fileNumber, recordId, targetRecord
targetRecord.Deleted = True
Put #fileNumber, recordId, targetRecord
Close #fileNumber
End Sub
Sub AddRecord(lastName As String, firstName As String)
Dim newRecord As SampleRecord
Dim fileNumber As Integer
Dim newRecordPosition As Long
newRecord.firstName = firstName
newRecord.lastName = lastName
newRecord.Deleted = False
newRecord.UserID = 123 ' assume an algorithm for assigning this value
fileNumber = FreeFile
Open "SampleFile" For Random As fileNumber Len = LenB(SampleRecord)
newRecordPosition = LOF(fileNumber) / LenB(SampleRecord) + 1
Put #fileNumber, newRecordPosition, newRecord
Close #fileNumber
End Sub