第9回 データベース 「5.データベース用コマンド キーモード」

9−5 データベース用コマンド キーモード

3)キーモード Key Mode
このモードで取り扱うデータベースは、いわゆるカード型のデータベース風で、ノンキーモードに比べて、データの操作がしやすくなっています。
このモードでは、ノンキーモードに存在しなかった、データの更新やレコードの削除、及び、簡易な検索機能があります。
そして、このように機能が多い分、コマンド類も多くなっています。

このモードでは、ノンキーモードとは異なり、「キー」と呼ばれるものでレコードを区別します。
したがって、1つのデータベース内で同じキーが存在することはできません。(このような唯一のキーを「ユニークなキー」と言います)

このモードで新規にデータを書きこむには、DbInsert()を使います。

  データの書き込み
    DbInsert(DbName,dbKey,varList)

(あ、もちろんDbOpen()で開いていなければ、処理できません。)
引数のうち、DbNameは、ノンキーモードと同じことで、開いたデータベースの変数名を指定します。
次の引数dbKeyは、キーとなるものを指定しますが、これは文字列や数字、日付など、どのような型でも指定できますが、実用的には、数値か文字列にするのが良いでしょう。
最後の、varListは、変数の羅列を表します。
キーモードでは、ノンキーモードとは異なり、1つのレコードに容量の許す限り、複数の値を格納することができます。
なので、カンマで区切って、書きこむべきデータを並べれば良いのです。
例えば、"myName" というキーレコードに、"mizuno"と"ami"を書き込むには、

    res=DbInsert(DbX,"myName","mizuno","ami")

とします。

これを読みこむには、DbRead()を使います。

  データの読み込み
    DbRead(DbName,dbKey,varList)

指定する引数は、DbInsert()と同じです。
例えば、先ほどのレコードに書きこんだデータを読み取るには、
    Dim A1 as string
    Dim A2 as string
      
    res=DbRead(DbX,"myName",A1,A2)
というように、同じ数だけ変数を用意します。 例では、2つの文字データを書きこんだレコードですので、2つの文字列型変数を用意しました。
(ただ、この変数の数は同じにする必要はないようで、実際、少ない方なら問題がないようです。)
注意すべき点は(予想がつくことですが)変数の型を間違えないことですね。

さて、書きこんだデータレコードを修正するには、DbUpdate() を使います。

  データの修正
    DbUpdate(DbX,dbKey,varList)

一方、削除は、レコード単位となりますので、DbDelete()を使って、データベース名とキーを指定するだけです。

  レコードの削除
    DbDelete(DbX,dbKey)

さて、これらの操作基準となるキーは、これだけでは、ノンキーモードのポジションの概念とそれほど変わりはありませんが、このキーモードでは、そのキーが「検索の対象」になる、という点が異なります。
DbFind()という関数を使えば、そのキーを持ったレコードがあるか否かを検索することができます。

  レコードの検索
    res=DbFind(DbName,DbKey)

この戻り値が、レコード番号を返せば嬉しいのですが、実際は、結果コード表の値が返ってきます。
したがって、そのキーが見つかれば、結果は 0 となります。
レコード番号が返されれば便利そうですが、検索にワイルドカードなどが使えるわけではないので、これで十分なのでしょう。

このDbFind()を使えば、処理すべきデータを新規に書き込むべきか、更新すべきかチェックできますね。
例えば、

    

このような手順を使って、エラーの出ないデータの書き込みが可能です。
(もちろん、他にも方法はありますよ)

さて、キーモードの読み込み処理では、キーを使う以外に、ノンキーモードのようなポジションの概念を使うことができます。
ただ、直接ポジションを指定するDbPosition()は使えませんので、別の方法を使います。
ノンキーモードでは、ポジションを指定すれば、そのレコード位置が処理対象になり、次のレコードを処理する場合は、ポジションを+1して再度指定します。
一方、キーモードでは、DbRead()などのキーでの処理を行った時点で、そのレコードにポジションが移ります。
そして、その次のレコードを処理するには、DbReadNext()、前のレコードを処理するには、DbReadPrev()を使います。

  次のレコードを読み込む
    DbReadNext(DbName,dbKey,varList)
  前のレコードを読み込む
    DbReadPrev(DbName,dbKey,varList)

基本的に、DbRead()と書式は同じです。
これらを使ってデータを読み込むと、ポジションは読み込み対象となった位置へ移動します。
例えば、DbReadNext()を実行すると、次のレコードにポジションを移動して、その後データを読み込む、といった事になります。
したがって、これらを使えば、キーを意識することなく、データを連続的に読みこむことが可能です。
しかし、ノンキーモードとは違って、存在しないレコードにポジションを移動させようとするとエラーになりますので、注意して下さい。
また、どのような順番でデータを書き込んでも、キーのアルファベット順(って言うと語弊があるか・・・)にレコードが並べ替えられることを覚えておいてください。


前へ     目次へ     次へ

第9回 データベース 「5.データベース用コマンド キーモード」