每当我尝试使用日期格式的主键作为"where attribute",执行SQLQuery时出现语法错误;在我的例子中:错误的语法接近";。1900";。然而,当我使用1900er数字格式在sql中创建一个表来表示日期时(因为excel保存日期:1=0.01.1900;2=02.01.1900等(,根据我的excel表中的日期列格式化日期列,该表将用于更新sql中的表,并运行完全相同的代码,不会出现错误,sql表也会得到更新。这是我使用过的代码的摘录。
strWhere = "[Date] = " & strDate
SQLQuery = "update " & TableNameSql & " " & _
"set " & _
"[Column1Data] = '" & strColumn1Data & "' " & _
"Where " & strWhere
两个选项的SQLQuery的debug.print如下所示:
update TableNameSql set[第1Data]='-01149'其中[Date]=02.01.1900'错误
update TableNameSql set[第1Data]='-01149'其中[Date]=2'无错误
我相信这可能与日期中的点有关(strWhere(。也可能是由于excel和SQL Server中的语言设置不同,导致了问题的出现。但是,创建表并将数据从SQL导出到Excel并不是问题。
我发现有人问过不同的类似问题,但没有一个答案适合我的具体问题。
使用1900er日期格式在实践中也没有用处,所以我想在使用常规日期时纠正这个错误。
考虑将ISO日期格式用作YYYY-MM-DD
,假设strDate
是VBADate
类型,则可以使用VBA的Format()
对其进行格式化。此外,一定要用单引号括起来。
strWhere = "[Date] = '" & Format(strDate, "YYYY-MM-DD") & "'"
更好地考虑参数化,避免任何引号或连词,如ADO命令,它允许您对齐数据类型:
' 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