簡體   English   中英

將VBA可變日期傳遞給SQL語句

[英]Passing vba variable date to sql statement

作為vba-sql的新手,我正在嘗試使用vba的for循環和Docmd.runsql填充表來填充表。 該代碼工作正常,但表中的值是:所有記錄的值為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不是日期,因此它沒有保存它並保存默認日期。...有什么想法嗎?

在實際日期值的前后包含#字符。 否則,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抑制信息,包括可能對故障排除有用的信息。

由於您要構建的SQL是:

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

解釋器可能正在執行整數除法並保存一個0值,這是默認日期。 請將值用磅符號括起來:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM