0

Vb6 とメモ帳で非常に小さなデータベースを管理しようとしています。Random のすべてのレコードをメモ帳ファイル (.dat) に収集します。Get and Put コマンドを使用して、保存したレコードを取得し、最新のものを挿入します。ここで、入力したレコード (おそらく最新のもの) を削除できるようにしたいと考えています。私は次のように言いました。

Delete #FileNumber1, LatestRec, MyRec

手に入れる絶好の機会でした。LatestRec は最新レコードの番号です (例: 5 は 5 番目を意味します)。MyRec は私のレコード変数です。助言がありますか?

4

1 に答える 1

2

上記の Delete ステートメントは、ランダム アクセス ファイルには適用されません。残念ながら、VB6 ランダム アクセス ファイルには、レコードを削除するための直接的なメカニズムがありません。これは主に、削除によって、ファイルの縮小 (空きスペースを埋める)、断片化 (未使用の空きスペース) などの他の問題が発生するためです。本当にレコードを削除する必要がある場合、他のすべてのレコードを一時ファイルにコピーし、古いファイルを削除して、一時ファイルの名前を「元の」名前に変更するしかありません。悲しいことに、その通りです。マイクロソフトから。

前もって理想的ではないことを認めますが、できることの 1 つは、「削除済み」フィールドをランダム アクセス ファイルに追加することです。デフォルトは 0 ですが、true、1、またはその他の関連値に変更します。レコードが無効になったことを示します。

削除されたレコードを再利用するためのルーチンを作成することもできますが、ファイルのセマンティクスにそれほど慣れている場合は、アプリケーションを SQL Server などのより堅牢なデータベース環境に移行することを検討することをお勧めします。

* EDIT : *これは、上記で説明した「削除されたフィールド」の概念を使用してレコードを削除/追加する方法を示すサンプル 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
于 2012-09-01T15:17:51.797 に答える