尝试使用SQL查询更新记录或将记录插入外部excel工作表

尝试使用SQL查询更新记录或将记录插入外部excel工作表,excel,vba,Excel,Vba,我正在尝试使用SQL和VBA插入或更新外部工作表。下面是完整的功能代码。 当我尝试在传递sql select查询的循环中打开记录集时,会发生此错误。 任何帮助都将不胜感激。我知道连接字符串在其他代码上使用时起作用 SQL字符串如下所示: select top 1 VALUENAME FROM [TradingTotals$] WHERE LOWER(VALUENAME)= LOWER('Trading') AND VALUEDATE =29/05/2020 AND CLOSINGMONTH =

我正在尝试使用SQL和VBA插入或更新外部工作表。下面是完整的功能代码。 当我尝试在传递sql select查询的循环中打开记录集时,会发生此错误。 任何帮助都将不胜感激。我知道连接字符串在其他代码上使用时起作用

SQL字符串如下所示:

select top 1 VALUENAME FROM [TradingTotals$] WHERE LOWER(VALUENAME)= LOWER('Trading') AND VALUEDATE =29/05/2020 AND CLOSINGMONTH = 'May' ORDER BY VALUEDATE DESC)
全功能代码

Public Function InsertClosingMonthTotals(ByVal CollOfTradeLogTotObj As Collection) As Boolean 

   Dim IsSuccess As Boolean
   Dim Item As TradeLogTotalsObj
   Dim Sql As String
   Dim SqlSelect As String
   Dim ConnDbString As String

   Dim TotalRecords As Long

   Dim Name As String
   Dim Value As Variant
   Dim Trading As Variant
   Dim LongShort As Variant
   Dim Therms As Variant
   Dim Valdate As Date
   Dim ClosingMonth As String

   ClosingMonth = Helper.FormatValue(Date, formatTypes.AsMonthlongOnly)


   Set Glob_Conn = New ADODB.Connection
   Set Glob_RecSet = New ADODB.Recordset

   ' Client-side cursor for correct return of record count
   Glob_RecSet.CursorLocation = adUseClient

   'Get Connection string according to the database server type
   ConnDbString = Helper.GetConnectionString(ServerTypes.Excel, Glob_FilePathForDataInput)


   'if the connection is closed then open it
   If (Glob_Conn.State = 0) Then
      Glob_Conn.Open (ConnDbString)
   End If


   For Each Item In CollOfTradeLogTotObj
      Name = Item.Name
      Value = Helper.FormatValue(Item.Value, AsNumber)
      LongShort = Helper.FormatValue(Item.LongShort, AsDecimalThreeDigits)
      Therms = Helper.FormatValue(Item.Therms, AsDecimalThreeDigits)
      Valdate = Helper.FormatValue(Item.dateTime, AsDateDisplay)

      SqlSelect = "select top 1 VALUENAME FROM [" & Glob_SheetNameTotalBooks & "$]" & _
      " WHERE LOWER(VALUENAME)= LOWER(" & "'" & Name & "'" & ")" & " AND VALUEDATE =" & Valdate & _
      " AND CLOSINGMONTH = " & "'" & ClosingMonth & "'" & _
      " ORDER BY VALUEDATE DESC)"

      Debug.Print ("SQL SELECT " & SqlSelect)
      Debug.Print ("*************************************************************")

      'open the record set
      If (Glob_RecSet.State <> 1) Then
     ' ******* ERROR ON LINE BELOW ON OPEN **********
      Glob_RecSet.Open SqlSelect, Glob_Conn, adOpenForwardOnly, adLockOptimistic
      End If

      TotalRecords = Glob_RecSet.RecordCount
      If (TotalRecords > 0) Then
      Sql = "UPDATE TradingTotals SET VALUENAME =" & "'" & Name & "'" & _
      ",VALUEDATE =" & Valdate & _
      ",VALUE =" & Value & _
      ",LONGSHORT =" & LongShort & _
      ",THERMS =" & Therms & _
      ",CLOSINGMONTH =" & "'" & ClosingMonth & "'" & _
      "  WHERE LOWER(VALUENAME) = LOWER(" & Name & ") AND VALUEDATE = " & Valdate & " AND CLOSINGMONTH =" & ClosingMonth
      Else
      Sql = "INSERT INTO " & Glob_SheetNameTotalBooks & " (VALUENAME,VALUEDATE,VALUE, LONGSHORT, THERMS, CLOSINGMONTH )" & _
      " VALUES (" & "'" & Name & "'" & "," & Valdate & "," & Value & "," & LongShort & "," & Therms & "," & ClosingMonth & ")"
      End If



      Debug.Print ("SQL INSERT " & Sql)
      Debug.Print ("*************************************************************")

      Glob_Conn.Execute Sql

   Next Item

 'cleanup
   Helper.CloseConnectionObjects Glob_RecSet, Glob_Conn

   InsertClosingMonthTotals = IsSuccess
End Function
似乎问题出在LOWER()身上;有人知道LOWER()是否不能用于excel查询吗

编辑2

这似乎只是在Excel中“正确”编写查询的问题;下面这一个有效。在前一个查询中,tehre在查询的末尾也是一个额外的“)”

SQL SELECT select top 1 VALUENAME FROM [TradingTotals$] WHERE VALUENAME= 'Trading' AND VALUEDATE ='29/05/2020' AND CLOSINGMONTH = 'May' ORDER BY VALUEDATE DESC
我现在尝试再次使用LOWER()

编辑3 LOWER()dos不起作用,至少我在VBA中使用它的方式是这样

SQL SELECT select top 1 VALUENAME FROM [TradingTotals$] WHERE LOWER(VALUENAME)='Trading' And ValueDate =  '29/05/2020' AND CLOSINGMONTH = 'May' ORDER BY VALUEDATE DESC

我还尝试对文本使用双引号

,因此在最后出现了不同的问题,但主要是由于查询SQL server时编写SQL时使用了错误的查询语法;尚未达到excel查询语法的最新速度

感谢所有添加有用评论的人,我不知道如何从评论中接受答案,所以我将此作为一个答案发布,但对我来说没有任何信用;所有这些都归功于在这里添加评论的伟大人物


我现在面临插入的其他问题。。基本上,即使我传递的数字和日期一样长,它也会像一般一样存储在excel中。即使我将电子表格中的列格式化为日期和编号,它也会再次恢复为常规??但是我为这个问题打开了一个新的问题

因此,最后出现了不同的问题,但主要是由于在我编写SQL时查询SQL server时使用了错误的查询语法;尚未达到excel查询语法的最新速度

感谢所有添加有用评论的人,我不知道如何从评论中接受答案,所以我将此作为一个答案发布,但对我来说没有任何信用;所有这些都归功于在这里添加评论的伟大人物


我现在面临插入的其他问题。。基本上,即使我传递的数字和日期一样长,它也会像一般一样存储在excel中。即使我将电子表格中的列格式化为日期和编号,它也会再次恢复为常规??但是我为这个问题打开了一个新的问题

在查询的
Glob\u SheetNameTotalBooks
末尾的
$
是为了什么-这是SQL吗?在查询的末尾还有一个不必要的
ORDER BY VALUEDATE DESC)
换句话说,我认为它失败的原因仅仅是因为查询是无效的。另外,我认为JET SQL使用双引号来表示字符串literalshouldn不是应该是LCASE()而不是LOWER()吗?在查询的
Glob\u SheetNameTotalBooks
末尾的
$
用于什么?这是SQL吗?在查询的末尾还有一个不必要的
ORDER BY VALUEDATE DESC)
换句话说,我认为它失败的原因仅仅是因为查询无效,我认为JET SQL使用双引号来表示字符串literals,它不应该是LCASE()而不是LOWER()?
SQL SELECT select top 1 VALUENAME FROM [TradingTotals$] WHERE LOWER(VALUENAME)='Trading' And ValueDate =  '29/05/2020' AND CLOSINGMONTH = 'May' ORDER BY VALUEDATE DESC