2016-07-14 5 views
1

ユーザーのリスト(文字列変数として)を使用して、SQLで最初のアイテムのコードを選択する基準(一度に1人のユーザー)として使用します。だから私はコードで後で実行するための文字列としてSQLクエリを配置します。例えばstrUserName = "A-ユーザーは"、私は、このSQL文字列を取得する場合、 "...クイック・ウォッチ" によると、アクセスVBA:SQLクエリで変数と文字列を組み合わせることはできません

strSQL = "SELECT TOP 1 Item.Code FROM Item WHERE Item.User = '" 
strSQL = strSQL & strUserName & "' ORDER BY ID DESC" 

私はこれを試してみた

SELECT TOP 1 Item.Code FROM Item WHERE Item.User = 'A-user 

"' ORDER BY ID DESC"の部分は、SQL文字列にまったく含まれていません!

そして"Set rst = CurrentDb.OpenRecordset(strSQL)"を使用して、SQLクエリを実行するために、私はこのエラーを取得する:

Run-time error '3075': Syntax error (missing operator) in query expression 'Item.User = "A-user"

は、私はそれをどのように修正することができますか?

+0

現在表示されているコードに従って動作するはずです、あなたの文字列の連結など、あなたのコードの多くを示してください。しかし、そうであるようにSQLステートメントを構築しますSQLインジェクションの古典的な方法... – DAXaholic

答えて

1

私はあなたのコードは、その3075エラーをトリガーする方法を見ていないしかし、私は代わりにパラメータクエリを使用すること。方法あなたのSQL文で引用された値を使用して問題を回避することができます。

Dim qdf As DAO.QueryDef 
Dim rs As DAO.Recordset 
Dim strSelect As String 
Dim strUserName As String 

strUserName = "A-user" 
strSelect = "SELECT TOP 1 i.Code FROM [Item] AS i WHERE i.User = [which_user] ORDER BY i.ID DESC" 
Set qdf = CurrentDb.CreateQueryDef(vbNullString, strSelect) 
qdf.Parameters("which_user").Value = strUserName 
Set rs = qdf.OpenRecordset 
+0

ありがとう!私はまだあなたの答えにいくつかの質問があります。 'strSelect =" SELECT TOP 1 i.Code FROM [項目] AS i WHERE i.User = [which_user] ORDER BY i.ID' は、固定/非可変の[ SQLの「which_user」を参照してください。そして、 'qdf.Parameters(" which_user ").Value = strUserName' は、上記のSQL文字列でこの固定された[which_user]を変更しますか? 二重引用符"which_user"の代わりに "which_user"?SQL文字列の[which_user]変数ありがとうございました – Doug

+0

'which_user'はパラメータですクエリパラメータは、クエリの実行時に指定する必要がある値のプレースホルダです。 'SELECT'ステートメントを新しいAccessクエリのSQLビューに貼り付けて、そのクエリを実行すると意味があります:' SELECT TOP 1 i.Code FROM [Ite m] AS i WHERE i.User = [which_user] ORDER BY i.ID DESC' – HansUp

+0

ありがとうHansUp。 私の問題は、strSelectの/に変数 "which_user"を挿入/変更できないということです。だから私のSQL文字列は文字通り 'strSelect ="のままです。SELECT TOP 1 i.Code FROM [Item] AS i.User = [which_user] ORDER BY i.ID'。[which_user]はA_userでなければなりません?strSelect 'strSelect =" SELECT TOP 1 i.Code FROM [Item] AS i WHERE i.User = 'A_user' ORDER BY i。ID "の前に" qdf.OpenRecordSet "、正しい? 申し訳ありません、私は本当に初心者です:) – Doug

0

アクセスは、一重引用符の使用について不満を抱くことがあります。また、ステートメントの末尾にセミコロンを追加します。二重引用符は、余分な二重引用符でエスケープされている場合(これにコードを変更してみてください:

strSQL = "SELECT TOP 1 Item.Code FROM Item WHERE Item.User = " 
strSQL = strSQL & """" & strUserName & """" & " ORDER BY ID DESC;" 
+0

上記のDAXaholicのコメントによると、このアプローチを使用してSQLインジェクションに気をつけてください – ThunderFrame

+0

これらのソリューションを試しましたが、役に立たなかった:( http://www.fontstuff.com/access/acctut15.htm 「&」「」「」「」「私のstrSQLはまだ切断されています! – Doug

+0

おそらく、変数名 'strSQL'にタイプミスがありますか?また、私の例では最初の行に変数が割り当てられ、2番目の変数に*が追加されます(つまり、変数は2行目の '='記号の両側に表示されます)。 – ThunderFrame

関連する問題