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