将vba变量日期传递给sql语句

时间:2015-05-26 15:38:41

标签: sql vba ms-access access-vba ms-access-2003

作为vba-sql中的新手,我尝试使用vbaDocmd.runsql中的for循环填充表格以填充表格。代码工作正常,但表中的值为:12/30/1899所有记录。我使用了一个消息框来检查,dt工作正常。它给了我循环中的日期并移动到下一个但在表格中它只给了我一个日期:12/30/1899。

Function dateTblUpdate()

    DoCmd.SetWarnings False
    DoCmd.RunSQL "DELETE FROM [date-table]"
    Dim dt As Date



    For dt = #1/1/2010# To DateSerial(Year(Now), Month(Now), Day(Now))
       'MsgBox DateSerial(Year(Now), Month(Now), Day(Now))
       'MsgBox dt
        DoCmd.RunSQL "Insert into [date-table] (the_date) values(" & dt & ")"

   Next
   DoCmd.SetWarnings True
End Function

日期表当前结果

the_date
----------
12/30/1899
12/30/1899
12/30/1899
12/30/1899
12/30/1899
12/30/1899

但预期结果:

the_date
------------
01/01/2010
01/02/2010
01/03/2010
01/04/2010

我的日期列是日期类型,我相信sql认为dt不是日期,所以它不保存它并保存默认日期....任何想法?

2 个答案:

答案 0 :(得分:5)

在文字日期值之前和之后加入#个字符。否则,db引擎会将 26/5/2015 之类的东西解释为26除以5除以2015 ... IOW作为数学表达式,而不是您想要的日期。

"Insert into [date-table] (the_date) values(" & Format(dt, "\#yyyy-m-d\#") & ")"

但是,如果使用参数查询,则无需在SQL语句中担心这些#个字符:

Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim dt As Date
Dim strInsert As String

strInsert = "INSERT INTO [date-table] (the_date) VALUES (pDate)"
Set db = CurrentDb
Set qdf = db.CreateQueryDef(vbNullString, strInsert)

'For dt = #1/1/2010# To DateSerial(Year(Now), Month(Now), Day(Now))
For dt = #1/1/2010# To Date
    qdf.Parameters("pDate").Value = dt
    qdf.Execute dbFailOnError
Next

注意使用QueryDef.Execute方法会消除DoCmd.SetWarnings False的动机。关闭SetWarnings会抑制信息,包括可能对故障排除有用的信息。

答案 1 :(得分:2)

由于您正在构建的SQL是:

Insert into [date-table] (the_date) values(1/1/2010)

解释器可能正在进行整数除法并保存0值,这是默认日期。用英镑符号代替值:

DoCmd.RunSQL "Insert into [date-table] (the_date) values(#" & dt & "#)"