0
4

2 回答 2

5

Access 使用 # 作为日期文字的分隔符,而不是 '. 您需要相应地更换。

于 2009-07-02T11:45:03.380 回答
0

与其将文字字符串注入 SQL 文本,不如考虑使用准备好的语句。这不仅为您提供 SQL 注入保护,您还可以将参数值的创建推迟到您选择的数据访问库,例如,以下 ADO 代码使用 Access 数据库引擎的专用 OLE DB 提供程序来创建DATETIME值并使用 VBA 函数CDate()进行转换使用本地计算机上的 Windows 区域设置将日期表示为 Date 值的字符串(当然,这可能与具有数据库文件的计算机不同):

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

更好的是,将其设为存储过程,例如在设计时执行一次:

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;"

这样,如果您的查询需要更改(但必需的参数不需要 - 您始终可以附加带有默认值的可选参数),您可以只更改一个后端中的 proc,而不必更改所有 SQL 代码前端。

于 2009-07-03T08:27:37.377 回答