2012-04-04 8 views
0

私は大きな問題と解決策を読んできましたが、私が間違っていることは分かりません。アクセス/ VBAとSQL WHERE句の形式の問題

BounceDate = DateValue(txtBounceDate.Value) 
bncSql = "DELETE _BounceMaster.* FROM _BounceMaster" & _ 
    " WHERE _BounceMaster.DateCheck >= #" & BounceDate & "#;" 
DoCmd.RunSQL bncSql 

_BounceMaster.DateCheckは、私が問題になるかもしれないが、私はそれがであるべきか、どのようにそこに別のどのような形式を把握することはできませんだと思う日付/時刻の形式です。私が知る限り、BounceDateは正解です.CDateを使用しても意味が分かりませんでした。上記のコードでデータの不一致エラーが発生しましたが、現在、構文エラーが発生しています。私は間違って何をしていますか?

+2

日付のロケールの問題に気をつけろ。曖昧さを避けるために、日付を年、月、日にフォーマットすることがほとんど常に最良です。 – Fionnuala

答えて

0

それは

DELETE FROM _BounceMaster 

ない

DELETE _BounceMaster.* FROM _BounceMaster 

する必要がありますあなたのコードは、SQLインジェクション攻撃の対象となるようあなたは、パラメータ化クエリを使用する必要があります。

+0

私の参考文献によると、どちらの方法も完全に有効です。表。*はFROMの前にオプションです。パラメータ化されたクエリに関しては、私はこれで十分に新しく、その意味が分からない。 – graidan

+0

ハードコードでは、構文が正しいことを確認してから、そこから進んでください。 [SQLインジェクション](http://en.wikipedia.org/wiki/SQL_injection) – RedFilter

+0

D'oh!私は日付をハードコーディングすることについて考えていなかった。それはまだ動作していないが、おそらく私はそこからそれを修正する方法を考え出すだろう。このデータベースは内部のみであり、他の方法で保護されるため、私はSQLインジェクションについて心配していません。 – graidan

1

問題は、日付の書式が原因であると考えられます。 BounceDate変数はDateTime型なので、文字列型変数と連結すると、VBAは地域設定の日付形式を使用してDateTime変数をString型に自動的にキャストします。

私が正しく覚えているように、MS AccessからSQLインタプリタはYYYY/MM/DDの日付形式と快適に感じるので、これを試してください。

BounceDate = DateValue(txtBounceDate.Value) 
bncSql = "DELETE _BounceMaster.* FROM _BounceMaster" & _ 
    " WHERE _BounceMaster.DateCheck >= #" & Format(BounceDate, "mm/dd/yyyy") & "#;" 
DoCmd.RunSQL bncSql 
+0

yyyy-mm-dd形式の日付リテラルも受け入れます。 – HansUp