【问题标题】:Excel VBA to update an SQL date fieldExcel VBA 更新 SQL 日期字段
【发布时间】:2021-06-12 15:28:51
【问题描述】:

我正在尝试用 Excel 中的日期单元格更新 SQL 表(日期字段)并收到错误

错误 #-2147217913:操作数类型 clah int 与日期不兼容

与数据库的连接正常。

这是我正在使用的代码

Private Sub CommandButton1_Click()
On Error GoTo FormLoadError
    Dim conn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim sConnString As String
    Dim FromDate As Date
    Dim ToDate As Date
    Dim FromNumber As String
 
    Sheet2.Range("a2:zz9999").ClearContents
 
    ' Create the connection string.
    sConnString = "Provider=SQLOLEDB;Data Source=SQL;" & _
                  "Initial Catalog=M2MTECLIVE;" & _
                  "Integrated Security=SSPI;"
      
    ' Create the Connection and Recordset objects.
    Set conn = New ADODB.Connection
    Set rs = New ADODB.Recordset
    
     ' Open the connection and execute.
    conn.Open sConnString
    FromDate = Worksheets("Parameters").Range("b4")   'Cell be contains a date in the format YYYY-MM-DD
    Set rs = conn.Execute("update dbo.M2MDates set FD = " & FromDate)
    conn.Close

有什么想法吗?

【问题讨论】:

  • 根据以下链接,日期应该用单引号括起来:stackoverflow.com/questions/31883448/…
  • 感谢您的编辑 Parfait :-)
  • 添加单引号有效,但没有更新为欧洲日期(即“01/06/2021”在 SQL 中变为“06/01/2021”,但进度 ....)
  • 将日期格式化为 YYYY-MM-DD。

标签: sql vba


【解决方案1】:

考虑通过 ADO 命令对象使用 ADO 参数,避免将值连接和标点到 SQL 语句:

conn.Open sConnString

' PREPARED STATEMENT WITH QMARKS ?
strSQL = "update dbo.M2MDates set FD = ?"
FromDate = Worksheets("Parameters").Range("b4") 

Set cmd = New ADODB.Command
With cmd
    .ActiveConnection = conn
    .CommandText = strSQL
    .CommandType = adCmdText

    '  BIND DATE PARAMETER
    .Parameters.Append .CreateParameter("date_prm", adDate, adParamInput, , FromDate)

    '  EXECUTE ACTION QUERY (NO RECORDSET)
    .Execute
End With

conn.Close
Set cmd = Nothing: Set conn = Nothing

【讨论】:

  • 谢谢 - 我不知道 VBA 可以参数化 SQL。有没有办法有多个参数?例如,SELECT * FROM t1 WHERE id = ? AND type = ? 如果您能指出我的文档,我将不胜感激。我已经 +1,但如果你愿意,我也可以创建一个新问题。
  • 有很多关于 VBA 参数化的 SO 帖子。几乎每一种现代编程语言都有像 ADO 这样的库,它们支持这种推荐的在应用层运行 SQL 的方法。以SO search或Google/Bing等开头。使用ADO,为SQL中的每个qmark(?)添加对应的.Parameters.Append行。
  • 谢谢@Parfait。几年前,当我接管一些用于内部网络查询的 VBA 时,它是未参数化的。虽然自从包含参数化以来我学到了很多东西,但我从来没有把它放在一起,当然 VBA 将能够参数化。如果我的目标不是尝试将其中一些数据检索移植到更多仪表板(如tableau)之类的实现,我会继续这样做。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
相关资源
最近更新 更多