本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

[VB2] DDE を用いた Access データベースの操作方法

文書番号: 402602

最終更新日: 2000/01/05


この資料は以下の製品について記述したものです。


この記事は、以前は次の ID で公開されていました: JP402602

概要

Visual Basic for Windows 2.0 は Microsoft Access(R) Relational Database
Management System for Windows(R) Version 1.1 ( 以下 Access 1.1) のデータ
ベース ファイル (.MDB) を直接操作することはできません。しかし、Dynamic
Data Exchange ( 以下 DDE) を使用することで、Visual Basic for Windows 2.0
から Access 1.1 のデータベースを操作することが可能になります。
この資料は Visual Basic for Windows 2.0 より Access 1.1 のデータベースの
データの取得、追加、更新、削除を行う方法について記述したものです。

サンプル データベース TELDATA.MDB

TELDATA.MDB 内には Personal というテーブルがあり、コード番号、フリガナ、
氏名、電話番号、生年月日のフィールドから構成されています。レコードは 4 件
格納されています。

テーブル Personal の構造

  フィールド名      データ型  説明
  L_Code          カウンタ型  通し番号
  t_Furi          テキスト型  フリガナ 20 バイト長、インデックスあり (重複あり)
  t_Name          テキスト型  氏名 20 バイト長
  t_Tel           テキスト型  電話番号 20 バイト長
  dt_Birthday  日付 / 時刻型  生年月日

テーブル Personal の内容

  L_Code    t_Furi             t_Name       t_Tel           dt_Birthday
  1         イケダ ヨシアキ    池田 良昭    011-111-1111    1988/04/04
  2         マツオ ヒロユキ    松尾 弘行    022-222-2222    1975/05/05
  3         ワタナベ チハル    渡辺 千春    033-333-3333    1968/03/03
  4         オオバ ユリ        大場 由利    044-444-4444    1988/08/08

レコードの取得、移動

レコードの取得および移動には LinkRequest メソッドで行います。この時、
LinkTopic 及び LinkItem プロパティの設定値によって取得できるレコードが
異なります。
取得したレコードの内容は、すべての項目内容が連結された文字列として
コントロールに格納されます。この文字列中には各フィールド間の区切り記号
としてタブが、各レコード間の区切り記号としてキャリッジ リターン及びラ
イン フィードが挿入されています。

LinkTopic プロパティ

MSACCESS|dbname;SQL sqlstatement
データベース dbname 内に対し SQL 文 sqlstatement を実行し、その結果得られた
ダイナセットと DDE を行います。sqlstatement に指定できるのは選択クエリー
のみに限られます。なお、指定する SQL 文の内容は Access 1.1 のクエリー作
成時に表示される SQL 文を参考にしてください。

LinkItem プロパティ

  FirstRow    先頭のレコードを指定します。
  LastRow     最後のレコードを指定します。
  PrevRow     1 件前のレコードを指定します。DDE 通信が開始された直後の状態で
              PrevRow を実行すると、最終レコードを取得できます。また、カレント
              レコードが先頭レコードにある状態で PrevRow を実行したときはエラー
              が発生します。
  NextRow     1 件次のレコードを指定します。DDE 通信が開始された直後の状態で
              NextRow を実行すると、先頭レコードを取得できます。また、カレント
              レコードが最終レコードにある状態で PrevRow を実行したときはエラー
              が発生します。

サンプル (TELVIEW1)

テーブル Personal のレコードを取得するサンプルです。これを実行する場合には、 あらかじめ Access 1.1 を起動し TELDATA.MDB を開いておく必要があります。
プログラムを実行し各コマンド ボタンを押すと、取得内容がテキスト ボックス
コントロールに格納されます。なお、長いレコードが取得される可能性があるため、 テキスト ボックス コントロールの MultiLine プロパティは True、ScrollBars
プロパティは 1 (水平) に設定してください。
  +--+------------------------------+--+--+
  |-|                              |▼|▲|
  +--+------------------------------+--+--+
  |+-------------------------------------+|
  ||Text1                                ||TextBox を一つ
  ||                                     ||
  ||                                     ||
  |+--+-------------------------------+--+|
  ||<-|■                             |->||
  |+--+-------------------------------+--+|
  |                                       |
  |+-------+ +-------+ +-------+ +-------+|CommandButton を 4 つ
  ||先頭 (F)| | 前 (P) | | 次 (N) | |最後(E)||
  |+=======+ +=======+ +=======+ +=======+|
  +---------------------------------------+
  Option Explicit
  Sub Command1_Click ()
      ' 先頭レコードを取得します
      Text1.LinkItem = "FirstRow"
      Text1.LinkRequest
  End Sub
  Sub Command2_Click ()
      ' エラー発生時にはその次の行を実行することを宣言します。
      On Local Error Resume Next
      '1 件前のレコードへ移動し内容を取得します。
      Text1.LinkItem = "PrevRow"
      Text1.LinkRequest
      ' 既に先頭レコードを指していた時はエラーが発生するので、再移動、
      ' 再取得を行います。
      If Err Then
          Text1.LinkItem = "FirstRow"
          Text1.LinkRequest
      End If
  End Sub
  Sub Command3_Click ()
      ' エラー発生時にはその次の行を実行することを宣言します。
      On Local Error Resume Next
      '1 件次のレコードへ移動し内容を取得します。
      Text1.LinkItem = "NextRow"
      Text1.LinkRequest
      ' 既に最終レコードを指していた時はエラーが発生するので、再移動、
      ' 再取得を行います。
      If Err Then
          Text1.LinkItem = "LastRow"
          Text1.LinkRequest
      End If
  End Sub
  Sub Command4_Click ()
      ' 最終レコードを取得します。
      Text1.LinkItem = "LastRow"
      Text1.LinkRequest
  End Sub
  Sub Form_Load ()
      'Persoanl 内のすべてのレコードとフィールド名を取得します。
      Text1.LinkTopic = "MSACCESS|TELDATA;SQL SELECT * FROM Personal;"
      Text1.LinkMode = 2
  End Sub
  Sub Form_Unload (Cancel As Integer)
      'DDE 通信を切断しプログラムを終了します。
      Text1.LinkMode = 0
  End Sub

レコードの更新、追加、削除

レコードの追加、更新、削除等、データベースの内容を変更するような処理を行う
には、LinkExecute メソッドで Access 1.1 に SQL 文 ( アクション クエリー )
を送信することで実現します。
そのためには以下のように LinkTopic プロパティ、LinkExecute メソッドを設定
する必要があります。

LinkTopic プロパティ

  MSACCESS|SYSTEM

LinkExcute メソッド

[RunSQL sqlstatement]
sqlstatement には処理内容を記述した SQL 文 ( アクション クエリー ) を指定
します。送信できる文字列長は 255bytes までです。文字列が送信されると
Access 1.1 のマクロ [SQL の実行 ] (RunSQL アクション ) が実行され、
sqlstatement が実行されます。
なお、DDE でアクション クエリーを実行する時に Access 1.1 が
“~件処理しました”というメッセージ ボックスを表示した場合、DDE タイムアウト エラーが発生してしまう可能性があります。これを防ぐにはあらかじめ LinkExecute メソッドで Access 1.1 のマクロ [ メッセージの設定 ] (SetWarnings アクション ) を実行し、システム メッセージの設定を非表示にしておきます。
RunSQL アクション、SetWarnings アクションの詳細については Access 1.1 の
マニュアルを参照してください。

サンプル (TELVIEW2)

テーブル Personal のレコードを更新、追加、削除するサンプルです。
これを実行するには、あらかじめ Access 1.1 を起動し TELDATA.MDB を開いておく
必要があります。各コマンド ボタンを押した時の実行結果は、Access 1.1 のテー
ブルを開いて確認してください。
  +--+--------------------+--+--+
  |-|                    |▼|▲|
  +--+--------------------+--+--+
  |+---------------------------+|
  ||Text1                      ||TextBox を一つ
  |+---------------------------+|
  |                             |
  |+-------+ +-------+ +-------+|CommandButton を 3 つ
  ||更新 (U)| |追加 (A)| |削除 (D)||
  |+=======+ +=======+ +=======+|
  +-----------------------------+
  Option Explicit
  Sub Command1_Click ()
      ' フィールド L_Code = 1 のレコードを更新します。
      Dim SqlStr As String
      ' 更新のための SQL 文を作成します。
      SqlStr = "UPDATE Personal SET t_Furi = ' アタ ユウイチ ', t_Name =
  ' 阿多 雄一 ',"
      SqlStr = SqlStr & "t_Tel = '088-888-8888', dt_Birthday = #1982/2/2#"
      SqlStr = SqlStr & "WHERE L_Code = 1;"
      'SQL 文を送信し実行させます。
      Text1.LinkExecute "[RunSQL """ & SqlStr & """]"
  End Sub
  Sub Command2_Click ()
      ' 新規レコードを 1 件追加します。
      Dim SqlStr As String
      ' 新規追加のための SQL 文を作成します。フィールド L_Code の値はカウンタ型
      ' のため、
      'Access 1.1 側で自動的に決定されます。
      SqlStr = "INSERT INTO Personal ( t_Furi, t_Name, t_Tel, dt_Birthday )"
      SqlStr = SqlStr & "SELECT ' カツマタ ヨシヒロ ', ' 勝俣 義弘 ',"
      SqlStr = SqlStr & "'099-9999-9999', #1977/7/7#;"
      'SQL 文を送信し実行させます。
      Text1.LinkExecute "[RunSQL """ & SqlStr & """]"
  End Sub
  Sub Command3_Click ()
      ' フィールド L_Code = 4 のレコードを削除します。
      Dim SqlStr As String
      ' 削除のための SQL 文を作成します。
      SqlStr = "DELETE FROM Personal WHERE L_Code = 4;"
      'SQL 文を送信し実行させます。
      Text1.LinkExecute "[RunSQL """ & SqlStr & """]"
  End Sub
  Sub Form_Load ()
      'SetWarnings アクションを実行し、Access 1.1 の
      ' システム メッセージを非表示にしておきます。
      Text1.LinkTopic = "MSACCESS|SYSTEM"
      Text1.LinkMode = 2
      Text1.LinkExecute "[SetWarnings 0]"
  End Sub
  Sub Form_Unload (Cancel As Integer)
      'DDE 通信を切断しプログラムを終了します。
      Text1.LinkMode = 0
  End Sub

Keywords: KBHOWTO KB402602
Technology: kbAudDeveloper kbVBSearch

inserted by FC2 system