Dao(Data Access Object)

access-dao.png

フォームのマクロからテーブルにアクセスするには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文の実行の仕方

 Dim DB As DAO.Database
 Dim SQL As String
 SQR = "UPDATE テーブル"
 DB.Execute (SQL)
  • 注意!

CRecordsetを使っている場合は、念のためExecuteSQLを読んだ後はCRecordset.Close()をしたほうがいい。
ExecuteSQLした後に、CRecordsetをOpenしようとすると実行エラーになるから。

RecordSetの扱い

Record Open

> Set RS = DB.OpenRecordset("テーブル名", dbOpenDynaset)

  • 注意!

" SELECT * FROM テーブル名"のように、SELECTの前に半角英数を入れるのはもっての他!!
dbcore.cppの3242行目でエラーになります。
理由は、

_tcsnicmp(m_strSQL, _afxSelect, lstrlen(_afxSelect)-1) != 0

_tcsnicmpとは、文字列1と文字列1を先頭から文字数分比較して、同じだったら0を返す関数。
_afxSelectの中には"SELECT"が入っているのだけれど、ここでm_strSQL(自分の渡したSQLクエリ)の先頭が" SELEC"みたいになってたら、違う文字列ですよ!って判定されちゃうのだ。

フィールドの数を知る

GetODBCFieldCount()

Recordのフィールドへのアクセスの仕方

  • 名前を使う方法

recordset!オブジェクト名  

(オブジェクト名っていうのは、テーブルの一番上に表示されてるフィールド名そのまんまだ)

  • 番号を使う方法

フィールド名が変なやつでうまくいかなかった場合はこれだ!

recordset.Fields(インデックス番号)

参照;Recordsetの作成(DAO編)

OpenRecordSet()の詳細

レコードの検索

指定した条件を満たす先頭、最後、次、前のレコードを検索し、そのレコードをカレントレコードにする。

RS.FinedFirst "フィールド名= '検索文字列' "

検索文字列を「''」シングルクオーテーションで囲む
レコードの検索

エラー

パラメータが少なすぎます。1を設定してください

2でもいいけど、SQL文が間違っている!
私はフィールド名を間違えたらこうなった。
フィールド名が間違っているという原因が多いエラー。

カーソルの状態が無効です。

クエリを出した結果、そのフィールド名に一致するようなフィールドが見つからなかった場合とかにでるかな。
つまり、
CRecordset->GetFieldValue()でミスったときに自動的にポップアップがでる。

引数が正しくありません

リファレンス


sql

サポートサイト Wikidot.com sql