1308 次
2 に答える
5
Access では、日付リテラルの区切り文字として ' ではなく # を使用します。それに応じて交換する必要があります。
于 2009-07-02T11:45:03.380 に答える
0
SQLテキストにリテラル文字列を吹き込むのではなく、プリペアドステートメントの使用を検討してください。これによりSQLインジェクションが保護されるだけでなく、選択したデータアクセスライブラリにパラメータ値の作成を延期できます。たとえば、次のADOコードは、Accessデータベースエンジン専用のOLE DBプロバイダーを使用してDATETIME
値を作成し、VBA関数CDate()
をキャストします。ローカルマシンのWindowsリージョナル設定を使用して日付から日付値を表す文字列(もちろん、データベースファイルを使用するマシンと同じではない場合があります):
Dim sDate As String
sDate = 4/1/09" ' ambiguous DATETIME value
Dim eDate As String
eDate = "2009-12-31 23:59:59" ' unambiguous DATETIME value
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
With cmd
.ActiveConnection = CurrentProject.Connection ' Access UI object
.CommandText = _
"SELECT * " & _
" FROM Cards " & _
" WHERE CARDEVENTDATE BETWEEN :start_date AND :end_date;"
.Parameters.Append .CreateParameter( _
":start_date", adDate, adParamInput, , CDate(sDate))
.Parameters.Append .CreateParameter( _
":end_date", adDate, adParamInput, , CDate(eDate))
Dim rs As ADODB.Recordset
Set rs = .Execute
End With
MsgBox rs.GetString
さらに良いことに、それをストアドプロシージャにします。たとえば、設計時にこれを1回実行します。
CurrentProject.Connection.Execute _
"CREATE PROCEDURE GetCards " & _
"( " & _
" :start_date DATETIME, " & _
" :end_date DATETIME " & _
") " & _
"AS " & _
"SELECT * " & _
" FROM Cards " & _
" WHERE CARDEVENTDATE BETWEEN :start_date AND :end_date;"
次に、実行時に毎回これを使用します。
.CommandText = _
"EXECUTE GetCards :start_date, :end_date;"
このように、クエリを変更する必要がある場合(ただし、必要なパラメータは変更されません。ただし、オプションのパラメータをデフォルト値でいつでも追加できます)、SQLコードをすべて変更するのではなく、1つのバックエンドでプロシージャを変更するだけで済みます。フロントエンド。
于 2009-07-03T08:27:37.377 に答える