当 '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
每当我尝试通过 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