问问题
1308 次
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 回答