当 'where-attribute' 是日期时,查询会导致 UPDATE 语法错误

Query causes UPDATE syntax error, when 'where-attribute' is a date

每当我尝试通过 excel-vba 更新 table 中的 SQL- 数据库时,使用日期格式的主键作为 'where-attribute',执行SQL查询时出现语法错误;在我的示例中:“.1900”附近的语法错误。 但是,当我使用 1900er 数字格式在 sql 中创建 table 来表示日期时(因为 excel 保存日期:1 = 01.01.1900;2 = 02.01.1900 等) ,根据我的 excel-sheet 中的日期列格式化日期列,它将用于更新 SQL 中的 table,并且 运行 确切相同的代码,没有出现错误并且 SQL-table 得到更新。这是我使用的代码的摘录。

strWhere = "[Date] = " & strDate

SQLQuery = "update " & TableNameSql & " " & _
"set " & _
"[Column1Data] = '" & strColumn1Data & "' " & _
"Where " & strWhere

两个选项的SQL查询的debug.print如下所示:

update TableNameSql set [Column1Data] = '-0,1149' 其中 [Date] = 02.01.1900 'Error

update TableNameSql set [Column1Data] = '-0,1149' Where [Date] = 2 'no Error

我相信这可能与日期 (strWhere) 中的点有关。 也可能是由于 excel 和 SQL-Server 中的不同语言设置导致问题出现。但是,创建 table 并将数据从 SQL 导出到 Excel 没有问题。

我发现了不同的类似问题,但是,none 的答案适合我的具体问题。

使用 1900er-Date-Format 在实践中也没有用,所以我想在使用常规日期时修复此错误。

考虑使用 ISO 日期格式 YYYY-MM-DD,您可以使用 VBA 的 Format() 进行格式化,假设 strDate 是 VBA Date 类型。另外,一定要用单引号括起来。

strWhere = "[Date] = '" & Format(strDate, "YYYY-MM-DD") & "'"

最好考虑参数化并避免任何引号或连接,例如ADO command,它允许您对齐数据类型:

' PREPARED STATEMENT WITH QMARKS
SQLQuery = "UPDATE " & TableNameSql & " " & _ 
           "SET [Column1Data] = ? " & _
           "WHERE [Date] = ?"

' ...  LOAD ADO CONNECTION ...

Set cmd = New ADODB.Command
With cmd
   .Activeconnection= conn  
   .CommandText = SQLQuery
   .commandType = adCmdText  

   ' BIND PARAMS
   .Parameters.Append .CreateParameter("StrParam", adVarChar, adParamInput, 255, strColumn1Data)
   .Parameters.Append .CreateParameter("DateParam", adDate, adParamInput, , strDate)

   ' RUN ACTION QUERY
   .Execute()  
End With