【问题标题】:Getting Type Mismatch error on vba while trying to fetch data from ODBC database尝试从 ODBC 数据库中获取数据时在 vba 上出现类型不匹配错误
【发布时间】:2020-10-18 21:44:15
【问题描述】:

我正在尝试使用 vba 从 SQL 查询中获取一些数据,但是当我尝试运行代码时,它给了我一个类型不匹配的错误。谁能帮忙

Sub Get_Rowkey()

Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim DBresults As ADODB.Recordset
Dim sqlquery As String, wsData As Worksheet, Datasht As Worksheet
Dim elr As Long
Dim lRow As Long
Set DBresults = New ADODB.Recordset

Set wsData = Worksheets("Main")
Set Datasht = Worksheets("Backend")
lRow2 = Datasht.Cells(Rows.Count, 2).End(xlUp).Row
elr = Datasht.Cells(Rows.Count, 3).End(xlUp).Row
If lRow2 > 1 Then

    Call createconn
    
    
     sqlquery = "SELECT vyc.object_id, vyc.rowkey, el.instrument, i.ccy, vyc.timezone, vyc.asof, vyc.snaptime, vp.rate as Mid, vp.bid, vp.ask, vp.updatetime" & vbNewLine & _
"from val_yield_curves vyc" & vbNewLine & _
"join val_yc_def_elements el on el.pkey = valuations_yieldcurves.getCurveDefinitionKey(vyc.asof, vyc.object_id)" & vbNewLine & _
"join (SELECT asof, curve, instrument, rate, quality, source, updatetime, bid, ask from val_prices_interestrates" & vbNewLine & _
"union SELECT asof, curve, instrument, rate, quality, source, updatetime, bid, ask from val_prices_basisswaps" & vbNewLine & _
"union SELECT asof, curve, instrument, rate, quality, source, updatetime, bid, ask from val_prices_oisrates" & vbNewLine & _
"union SELECT asof, curve, instrument, rate, quality, source, updatetime, bid, ask from val_prices_fx)" & vbNewLine & _
"vp on el.instrument = vp.instrument and vp.asof = vyc.asof and vp.curve = vyc.rowkey" & vbNewLine & _
"join (select pkey, symbol from val_mds_sources) vms on vms.pkey = vp.source" & vbNewLine * _
"join instruments i on  i.pkey = el.instrument" & vbNewLine & _
"where vyc.asof in '12Oct2020'" & vbNewLine & _
"and vyc.timezone in 'L1200'" & vbNewLine & _
"and vyc.object_id like '%FXSpot%'" & vbNewLine & _
"ORDER BY vp.updatetime"`enter code here`
    ''sqlquery = Left(sqlquery, Len(sqlquery) - 1) & ")"
    DBresults.Open sqlquery, DBConn, adOpenDynamic

【问题讨论】:

  • 所有子句前都需要一个空格,FROMJOINUNIONWHEREORDER BY,以及运算符:AND
  • 嗨,Parfait,感谢您的解决方案,您能否进一步说明一下。我需要使用类似“来自 abc 表的东西吗?

标签: sql excel vba


【解决方案1】:

考虑将涉及的长 SQL 保存在一个文本文件中,其中包含所有需要的换行符和空格格式,这有助于提高可读性和可维护性。您甚至可以捕获语法错误,例如未将 IN 元素括在括号中(尽管应将一个项目列表替换为 =)。

然后,以字符串的形式读入 Excel,没有任何混乱的连接或引号。

SQL (另存为 .sql 文件)

SELECT vyc.object_id
       , vyc.rowkey
       , el.instrument
       , i.ccy
       , vyc.timezone
       , vyc.asof
       , vyc.snaptime
       , vp.rate AS Mid
       , vp.bid
       , vp.ask
       , vp.updatetime

FROM val_yield_curves vyc

JOIN val_yc_def_elements el 
  ON el.pkey = valuations_yieldcurves.getCurveDefinitionKey(vyc.asof, vyc.object_id)

JOIN 
    (SELECT asof, curve, instrument, rate, quality, source, updatetime, bid, ask 
     FROM val_prices_interestrates
     UNION
     SELECT asof, curve, instrument, rate, quality, source, updatetime, bid, ask
     FROM val_prices_basisswaps
     UNION
     SELECT asof, curve, instrument, rate, quality, source, updatetime, bid, ask 
     FROM val_prices_oisrates
     UNION 
     SELECT asof, curve, instrument, rate, quality, source, updatetime, bid, ask 
     FROM val_prices_fx) vp
  ON el.instrument = vp.instrument 
  AND vp.asof = vyc.asof 
  AND vp.curve = vyc.rowkey
    
JOIN 
    (SELECT pkey, symbol FROM val_mds_sources) vms 
  ON vms.pkey = vp.source

JOIN instruments i 
  ON  i.pkey = el.instrument

WHERE vyc.asof IN ('12Oct2020')         -- FIXED
  AND vyc.timezone IN ('L1200')         -- FIXED
  AND vyc.object_id LIKE '%FXSpot%'

ORDER BY vp.updatetime

VBA

...

' READ SQL QUERY FROM FILE INTO STRING
With CreateObject("Scripting.FileSystemObject")
      sqlquery = .OpenTextFile("C:\path\to\my\SQL\Query.sql", 1).readall
End With

DBresults.Open sqlquery, DBConn, adOpenDynamic

【讨论】:

  • 我已经进行了建议的更改,但仍然遇到相同的错误。我附上了修改后的查询的屏幕截图。不知道还有什么问题
  • 如果您确实使用了.sql 文件并且仍然出现相同的错误,请尝试通过一次取出一个JOINWHERE 条件来测试查询,以确定哪个是问题行。否则,识别 join/where 行中每个变量的所有数据类型。我们不知道您的架构。另外,检查valuations_yieldcurves.getCurveDefinitionKey()的返回类型。
  • 我已经手动重写了整个查询,现在错误已更改为运行时错误 91、对象变量或未设置块变量,这行出现:DBresults.Open sqlquery、DBConn、adOpenDynamic
  • 我明白了,设置 DBresults = New ADODB.Recordset。它现在可以工作了:)
  • 好奇,你用过这个 .sql 文件的方法吗?如果解决方案有帮助,请让未来的读者know
猜你喜欢
  • 1970-01-01
  • 2019-09-03
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 2022-01-02
  • 1970-01-01
相关资源
最近更新 更多