これは非常に基本的な質問ですが、フォームが存在するMS Accessデータベースに対していくつかのフォーム値を介して構築しているクエリを実行しようとしています。正式にADOを実行する必要はないと思いますが、多分私は行う。
とにかく、いくつかの助けをいただければ幸いです。n00bでごめんなさい。;)
次のDAOコードを使用して、AccessDBにクエリを実行できます。
Dim rs As DAO.Recordset
Dim db As Database
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT * FROM Attendance WHERE ClassID = " & ClassID)
do while not rs.EOF
'do stuff
rs.movenext
loop
rs.Close
Set rs = Nothing
私の場合、ClassIDはフォームのテキストボックスです。
ADO バージョンが必要な場合に備えて、次のようにします。
Dim cn as new ADODB.Connection, rs as new ADODB.RecordSet
Dim sql as String
set cn = CurrentProject.Connection
sql = "my dynamic sql string"
rs.Open sql, cn ', Other options for the type of recordset to open, adoOpenStatic, etc.
While Not rs.EOF
'do things with recordset
rs.MoveNext ' Can't tell you how many times I have forgotten the MoveNext. silly.
Wend
rs.Close
cn.Close
Set rs = Nothing
Set cn = Nothing
DAO と ADO の使用法は非常に似ています。DAO を使用すると制御が強化され、ADO を使用するとパフォーマンスがわずかに向上します。私が遭遇したほとんどのアクセスデータベースアプリケーションでは、実際には違いはありません。私が見た大きな違いは、リンクされたテーブルにあります。多くの場合、ADO の方がパフォーマンスが向上します。
これは私が思いついたもので、実際に機能します。
Dim rs As DAO.Recordset
Dim db As Database
Set db = CurrentDB
Set rs = db.OpenRecordset(SQL Statement)
While Not rs.EOF
'do stuff
Wend
rs.Close
あなたが与えられた答えと、DAO レコードセットのループを受け入れているようです。これは一般に、テキストを完成させるための非常に非効率的な方法です。たとえば、これは次のとおりです。
Set db = CurrentDB()
Set rs = db.OpenRecordset("[sql]")
If rs.RecordCount > 0
rs.MoveFirst
Do While Not rs.EOF
rs.Edit
rs!Field = "New Data"
rs.Update
rs.MoveNext
Loop
End If
rs.Close
Set rs = Nothing
Set db = Nothing
次のものよりもはるかに効率が低下します。
UPDATE MyTable SET Field = "New Data"
次のコマンドで実行できます:
CurrentDb.Execute "UPDATE MyTable SET Field = 'New Data'"
レコードセットをループする必要があることはめったになく、ほとんどの場合、SQL 更新は桁違いに高速になります (データ ページで保持される読み取り/書き込みロックがはるかに短くなります)。