|
Accessからデータベースへアクセスする方法はいくつかありますが、主要なものは以下のの4つです。
(1) ADO(ActiveX Data Objects)を使用してデータベースを操作する
(2) Oracle Objects for OLE(OO4O)を使用する方法
(3) DAO(データ アクセス オブジェクト)を使用してデータベースを操作する方法
(4) データベース・サーバのフロントエンドとしてAccessを利用する方法(データベースとリンクする) |
|
Page Index (@〜Aは別ページへジャンプします) |
|
@ ADO(ActiveX Data Objects)を使用してデータベースを操作する |
|
ADO は OLEDB プロバイダが提供されているあらゆるデータベースとの通信を行うことを視野にいれたオブジェクトライブラリです。 |
|
|
|
A OO4O(Oracle Objects for OLE)を使用してデータベースを操作する |
|
OO4O は Oracle データベースのみを対象にしたインターフェースです。 |
|
|
|
B DAO(データ アクセス オブジェクト)を使用してデータベースを操作する |
|
Microsoft Jetデータベースエンジンを経由してAccessデータベースに接続するものです。
DAO はそもそも Jet
データベースエンジンを対象にして開発されているのでJetのもつセキュリティ機能、データ定義機能、レプリケ-ション機能などを十分に操作することができます。
事前の準備として、[ツール]→[参照設定]で、「MIcrosoft DAO3.6ObjectLibrary」をチェックしておきます
DBEngine
├ Error
│
└ Workspace
├ Database
│ └ Table ── QueryDef ─ Recordset ─ Relation ─ Container
│ ├ Field ├ Field └ Field └ Field └ Document
│ └ Index └ Parameter
│ └ Field
├ Group
│ └ User
└ User
└ Group
|
|
|
|
|
C データベース・サーバのフロントエンドとしてAccessを利用する |
|
Microsoft AccessはODBCインターフェイスを介して、現在使われている主要なデータベースサーバとシームレスに接続することができます。
Accessを介することで、単純なデータ入力は、Accessの標準的な機能である「テーブル」や「フォーム」によって行うことができるし、蓄積されたデータを処理したいという場合にも「クエリ」を使えば、エンド・ユーザーが視覚的にデータ分析することが可能です。インポート・エクスポート機能などを使用すれば、Microsoft
Excelなどのソフトウェアと手軽に連携することもできます。
参照 : データベース・サーバのフロントエンドとしてAccessを利用する @IT:Windows TIPS
Oracle のデータを Access で抽出し新規のテーブルを作る
Access2000から接続してみる |
|
TIPS |
|
ORACLEのデータベースを開く・閉じる Access a Go! Go!
ADOを用いたデータベースアクセス手法 |
|
本章では、データベースの操作についてコードサンプルを示しながら説明していきます。 |
(DAOによる操作) |
|
|
Dim wk_DB As DAO.Database 'データベースオブジェクト
Dim wk_RS As DAO.Recordset 'レコードセットオブジェクト
|
|
|
|
|
'カレントデータベースに接続する(通常はこちら)
Set wk_DB = CurrentDb()
'他のAccessデータベースに接続する
Set wk_DB = DBEngine.Workspaces(0).OpenDatabase("C:\アクセス.mdb") |
|
|
|
|
|
新しく Recordset オブジェクトを作成し、Recordsets コレクションに追加します。
@Recordsetオブジェクトの作成
'テーブルに登録されているレコードの集りをRecordsコレクションに作成する
Set wk_RS = wk_Db.OpenRecordset("テーブル名",dbopenTable)
'SQLで抽出したレコードの集りをRecordsコレクションに作成する(レコードを更新しない場合に使用します)
Set wk_RS = wk_DB.OpenRecordset("SQL文", dbOpenSnapshot)
'SQLで抽出したレコードの集りをRecordsコレクションに作成する(レコードを更新する場合に使用します)
Set wk_RS = wk_Db.OpenRecordset("SQL文",dbopenDynaset) 'SQLで抽出したレコード、レコードを更新
'選択クエリで抽出したレコードの集りをRecordsコレクションに作成する
Set wk_RS = wk_Db.OpenRecordset("クエリ名",dbopenDynaset)
Aレコードセット内のカーソルの移動
抽出した結果セット(レコードセット)に対して、1レコードづつ処理します。
・カーソルを先頭レコードへ移動する
wk_RS.MoveFirst
・カーソルを1つ前のレコードへ移動する
wk_RS.MovePrevious
・カーソルを次のレコードへ移動する
wk_RS.MoveNext
・カーソルを最終レコードへ移動する
wk_RS.MoveLast
・指定したレコード番号を基準にしてカーソルを前後に移動する
wk_RS.Move[n]
BFieldの参照
・インデックス番号による記述
wk_RS.Fields(インデックス番号) '項目の順番に0から始まる番号
・オブジェクトの名前による記述(以下のいづれか)
wk_RS.Fields("フィールド名")
wk_RS.Fields!フィールド名
wk_RS!フィールド名
CBOF、EOF プロパティ
BOF カレント レコードの位置が最初のレコードよりも前にある場合True
EOF カレント レコードの位置が最後のレコードよりも後にある場合True
レコードがないRecordsetは、BOF、 EOF共にTrue に設定される
Dレコード件数(プロパティ)
・wk_RS.RecordCount
|
|
例:条件に合致するRecordを検索し、Recordsetを作成する
Dim wk_DB As DAO.Database 'データベースオブジェクト
Dim wk_RS As DAO.Recordset 'レコードセットオブジェクト
Dim wk_SQL As String
wk_SQL = "Select * From JOBS Where JOB_ID = """ &
wk-Text1 & """"
Set wk_DB = CurrentDb()
Set wk_RS = wk_DB.OpenRecordset(wk_SQL, dbOpenSnapshot)
If wk_RS.RecordCount <> 0 Then
"検索成功
Else
"検索失敗
End If
wk_DB.Close
wk_RS.Close
|
|
|
|
|
|
Recordsetから条件に合致するRecordを検索する
@検索の種類
・FindFirst : 検索条件に合致したRecordset内の最初のレコードを読み込む
Set wk_RS = Db.OpenRecordset("テーブル名",dbopenDynaset)
wk_RS.FindFirst "フィールド名=あいうえお'"
・FindLast : 検索条件に合致したRecordset内の最後のレコードを読み込む
wk_RS.MovePrevious
・FindNext : 現在読み込まれているレコードの次のレコードを読み込む
wk_RS.MoveNext
・FindPrevious : 現在読み込まれているレコードの一つ前のレコードを読み込む
wk_RS.MoveLast
ANoMatch プロパティ
検索が成功した場合、NoMatch プロパティは False になる
If wk_RS.NoMatch = False Then '検索に成功
|
|
例:テーブル"JOBS"の内容をテキスト形式のCSVに出力する
Dim csvFILENAME As String
Dim wk_DB As Database
Dim wk_Rec As Recordset
csvFILENAME = CurrentProject.Path & "\csvJOBS.txt"
Open csvFILENAME For Output As #1
Set wk_DB = CurrentDb()
Set wk_Rec = wk_DB.OpenRecordset("JOBS", dbOpenTable)
Do Until wk_Rec.EOF = True
Write #1, wk_Rec.Fields("JOB_ID"), wk_Rec.Fields("JOB_TITLE"),
wk_Rec.Fields("MIN_SALARY")
wk_Rec.MoveNext
Loop
wk_Rec.Close
wk_DB.Close
Close #1 |
|
|
|
|
|
@更新の手順
・編集するレコードをカレントレコードに移動する
wk_RS.MoveNext
・Editメソッドを利用して編集用のバッファを用意する
wk_RS.Edit
・レコードを編集する
wk_RS!フィールド名 = "更新内容"
・Updateメソッドを実行してRecordsetオブジェクトに変更内容を保存する
wk_RS.Update
ACancelUpdateメソッド
変更したレコードを保存しないでEditメソッドの実行を終了する
wk_RS.CancelUpdate
|
|
|
|
|
|
追加の手順
・Addメソッドを利用して編集用のバッファを用意する
wk_RS.AddNew
・レコードを編集する
wk_RS!フィールド名 = "追加内容"
・Updateメソッドを実行してRecordsetオブジェクトに変更内容を保存する
wk_RS.Update
|
|
|
|
|
|
削除の手順
・削除するレコードをカレントレコードに移動する
wk_RS.MoveNext
・レコードを削除する
wk_RS.Delete
|
|
|
|
|
|
アクション クエリー(データのコピーと変更を行うクエリー)または SQL ステートメントを実行する
@SQL ステートメントを実行
Dim wk_DB As DAO.Database
Set wk_DB = CurrentDb
wk_DB.Execute ("SQL文")
Aアクションクエリを実行
With CurrentDb().QueryDefs("クエリ名")
. Parameters(0) = パラメータ値
. Parametaers(1) = パラメータ値
. Execute
End With
|
|
|
|
|
|
開いている DAO オブジェクト(Database、TableDef、Recordset、QueryDef)を閉じる wk_RS.Close
Set wk_RS = Nothing
wk_DB.Close
Set wk_DB = Nothing |
|
|
|
|
|
DAOメソッドと組み合わせて使用できる DoCmd.SetWarnings False '警告メッセージを非表示にする
DoCmd.RunSQL SQL文
DoCmd.SetWarnings True '元に戻す
|
|
|
|
|
|
DAOメソッドと組み合わせて使用できる
. DoCmd.SetWarnings False '警告メッセージを非表示にする
DoCmd.OpenQuery "年次売上高", , acReadOnly '[年次売上高] クエリをデータシート
ビューで開く
DoCmd.SetWarnings True '元に戻す |