2

ここに画像の説明を入力してください

MSAccess2007テーブルがあります。

列は、DB、Module、CommentID、およびCommentです。

MSAccessクエリデザインで正しいレコードを返すSQLクエリがあります。

イミディエイトウィンドウで、Ms AccessQueryDesignとVBAモジュール「Module1」のSQLが同一であることを確認しました。

私は以下のように関数を呼び出します:

?LookupComment(currentproject.Name,Application.VBE.ActiveCodePane.CodeModule,"1")

その後、関数内のstrSQLは、イミディエイトウィンドウで次のように確認されます。

Select * from tblComments where DB='db1.accdb' AND Module='Module1' AND CommentID='1'

「strSQ」を「tblComments」に置き換えると、関数は正常に返されます。

しかし、strSQLを使用したrst.openでエラーが発生します

オブジェクト'_Recordset'のメソッド'Open'が失敗しました

Public Function LookupComment(theDB, theModule, theCommentID As String) As String

Dim cn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim strSQL As String

Set cn = CurrentProject.Connection
Set rst = New ADODB.Recordset

strSQL = "Select * from tblComments where DB='" & theDB & "' AND " _
    & "Module='" & theModule & "' AND CommentID='" & theCommentID & "'"
rst.Open strSQL, cn, adOpenDynamic, adLockReadOnly

' rst.Open "tblComments", cn, adOpenDynamic, adLockReadOnly

If rst.EOF = False Or rst.BOF = False Then
    rst.MoveFirst
    LookupComment = rst!Comment
End If

Set rst = Nothing
Set cn = Nothing


End Function

考え?

TIA

4

3 に答える 3

6

この変更で関数をテストします。

strSQL = "Select * from tblComments where DB='" & theDB & "' AND " _
    & "[Module]='" & theModule & "' AND CommentID='" & theCommentID & "'"

ModuleJet の予約語なので、角かっこで囲みました。Access の問題名と予約語を参照してください。

その括弧なしの名前を持つ SELECT ステートメントにより、ADO レコードセット.Openメソッドが失敗します。ご報告のとおり、クエリ デザイナーで開いたクエリに対して同じ SELECT ステートメントを使用すると成功します。Moduleまた、Igor の DAO レコードセットの提案も、角かっこで囲んでいるかどうかに関係なく機能しました。なぜ失敗したのかわかりません。

予約語をいつ使用するかを正確に予測するのは困難です。db オブジェクト名があなたを悩ませるからです。それらを完全に使用しない方が安全です。それらを避けることができない場合は、クエリでそれらの名前を角括弧で囲み、db エンジンが混乱する可能性を減らします。

Allen Browne の無料のDatabase Issue Checker Utilityをダウンロードして、データベースの予約語を調べることができます。また、データベースに関するその他の潜在的な問題についても警告します。

于 2012-04-22T06:38:28.147 に答える
2

代わりにDAORecordsetを使用してください。

Public Function LookupComment(theDB, theModule, theCommentID As String) As String

Dim rst As Recordset
Dim strSQL As String

strSQL = "Select * from tblComments where DB='" & theDB & "' AND " _
    & "Module='" & theModule & "' AND CommentID='" & theCommentID & "'"

Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)

If rst.EOF = False Or rst.BOF = False Then
    rst.MoveFirst
    LookupComment = rst!Comment
End If

Set rst = Nothing

End Function

ちなみに、文字列/テキストタイプとしてCommentIDが必要ですか?

于 2012-04-22T04:38:42.760 に答える
0

クエリの最後にセミコロンがないようです。

于 2012-04-22T02:45:17.433 に答える