0
4

2 に答える 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 に答える