Dao(Data Access Object)
最終更新日10 Jan 2014 05:30
Table of Contents
|
フォームのマクロからテーブルにアクセスするにはDAOってやつを使わないといけないらしい。
RecordSetでちょこちょこやるよりも,SQL文で実行した方が強力だし簡単!!
セットアップ
MFCでプログラム作るときはUnicodeの文字セットを使うこと!じゃないと、取得したデータが文字化けになってしまうよ。ただし、ODBCから扱う場合はUnicodeにしなくても大丈夫みたい。
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Dim SQL As String
Set DB = CurrentDb()
Set RS = DB.OpenRecordset("テーブル名", dbOpenTable)
do something!
RS.Close
DB.Close
'メモリの開放
'Set RS = Nothing
Set DB = Nothing
SQL文の実行の仕方
- 注意!
CRecordsetを使っている場合は、念のためExecuteSQLを読んだ後はCRecordset.Close()をしたほうがいい。
ExecuteSQLした後に、CRecordsetをOpenしようとすると実行エラーになるから。
RecordSetの扱い
Record Open
- 注意!
" SELECT * FROM テーブル名"のように、SELECTの前に半角英数を入れるのはもっての他!!
dbcore.cppの3242行目でエラーになります。
理由は、
_tcsnicmp(m_strSQL, _afxSelect, lstrlen(_afxSelect)-1) != 0
_tcsnicmpとは、文字列1と文字列1を先頭から文字数分比較して、同じだったら0を返す関数。
_afxSelectの中には"SELECT"が入っているのだけれど、ここでm_strSQL(自分の渡したSQLクエリ)の先頭が" SELEC"みたいになってたら、違う文字列ですよ!って判定されちゃうのだ。
フィールドの数を知る
Recordのフィールドへのアクセスの仕方
- 名前を使う方法
recordset!オブジェクト名
(オブジェクト名っていうのは、テーブルの一番上に表示されてるフィールド名そのまんまだ)
- 番号を使う方法
フィールド名が変なやつでうまくいかなかった場合はこれだ!
recordset.Fields(インデックス番号)
レコードの検索
指定した条件を満たす先頭、最後、次、前のレコードを検索し、そのレコードをカレントレコードにする。
RS.FinedFirst "フィールド名= '検索文字列' "
検索文字列を「''」シングルクオーテーションで囲む
レコードの検索
エラー
パラメータが少なすぎます。1を設定してください
2でもいいけど、SQL文が間違っている!
私はフィールド名を間違えたらこうなった。
フィールド名が間違っているという原因が多いエラー。
カーソルの状態が無効です。
クエリを出した結果、そのフィールド名に一致するようなフィールドが見つからなかった場合とかにでるかな。
つまり、
CRecordset->GetFieldValue()でミスったときに自動的にポップアップがでる。
引数が正しくありません
リファレンス
sql