2012-04-22 17 views
2

enter image description hereMS AccessのVBA ADODB Recordset.OpenテーブルOKしかし、SQLが

を失敗した私は、MS Access 2007のテーブルを持っている:

列を、私はSQLを持っているDB、モジュール、CommentID、および

コメントしていますMS Access Query Designで正しいレコードを返すクエリ。

私は、イミディエイトウィンドウで、SQLがMs Access Query DesignとVBAモジュール "Module1"で同一であることを確認しました。

私は以下のように関数を呼び出す:私は「tblComments」機能で「strSQ」を交換する場合、関数内

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

その後ます。strSQLが

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

として即時ウィンドウで確認されています罰金を返します。

しかし、私がいます。strSQLでrst.openで '_Recordset' オブジェクトの '開く'

メソッドをエラーを取得していますが

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

答えて

6

この変更にあなたの機能をテストします。

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

それはジェットの予約語であるので、私は角括弧で囲まれてModuleを。 Problem names and reserved words in Accessを参照してください。

その括弧のついた名前のSELECTステートメントは、ADOレコードセット.Openメソッドを失敗させます。あなたが報告したように、同じSELECT文がクエリデザイナで開かれたクエリに使用されたときに成功します。また、IgorのDAOレコードセットの提案は、私がModuleをかっこで囲んでいるかどうかにかかわらず役に立ちました。なぜそれがあなたのために失敗したのか分かりません。

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

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

+0

は実際に私がカッコについて考えたが、テストと、それはそれらなしでうまく働いた。 –

+0

@IgorTurmanあなたのDAOレコードセットを意味している場合私はそれが括弧なしで動作することに同意しますが、私は括弧なしで動作するようにADOレコードセットのアプローチを得ることができませんでした。なぜそれがADOではなくDAOでは問題であるのか分かりません。テーブル名とフィールド名の予約語は避けています: – HansUp

+0

予約名が問題でした。 – user824232

0

質問の最後にセミコロンがありません。代わりに

+3

これは問題ではありません –

+0

セミコロンでテストされ、確認されたエラーが残っています – user824232

2

使用DAOレコードセット:サイドノートで

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を必要と確信していますか?

+0

ありがとうございます。コピーされて貼り付けられたコードはまだSQL上にあります。 – user824232

+0

エラーメッセージには2つのパラメータが必要です。 "tblCommentsはうまく動作します – user824232

+0

@ user824232:私が掲示する前に、私はコードをテストしました!うまくいきました!"期待された2パラメータ "というエラーが出たら、あなたの列名のうち3つのうち2つが無効です。有効なカラム名。 –

関連する問題