【问题标题】:Excel VBA ADO SQL JOINExcel VBA ADO SQL JOIN
【发布时间】:2016-10-02 23:38:42
【问题描述】:

我使用 Excel & VBA 下面是生成 SQL 语句的代码:

Function getVehicleById(p_vehicleId As Long) As clsVehicle

Dim dbConfig As clsConfig_Db

Dim queryString As String
Dim selectClause As String
Dim fromClause As String
Dim whereClause As String

Dim conDb As New ADODB.Connection
Dim rs As New ADODB.Recordset

Dim vehicle As New clsVehicle

Set dbConfig = Factory.getDbConfig

selectClause = " SELECT * "

fromClause = " FROM " & _
    " [" & dbConfig.VEHICLES_TABLE_NAME & "$] veh " & _
    ",[" & dbConfig.CONTACTS_TABLE_NAME & "$] con " & _
    ",[" & dbConfig.TRANSMISSION_TYPES_TABLE_NAME & "$] tt " & _
    ",[" & dbConfig.FUEL_TYPES_TABLE_NAME & "$] ft " & _
    ",[" & dbConfig.COLOURS_TABLE_NAME & "$] col " & _
    ",[" & dbConfig.MAKES_TABLE_NAME & "$] mke " & _
    ",[" & dbConfig.MODELS_TABLE_NAME & "$] mod " & _
    ",[" & dbConfig.ENGINE_SIZES_TABLE_NAME & "$] es "

whereClause = " WHERE " & _
    " veh." & dbConfig.VEH_CON_ID_COLUMN_NAME & " = " & " con." & dbConfig.CON_ID_COLUMN_NAME & _
    " AND veh." & dbConfig.VEH_TT_ID_COLUMN_NAME & " = " & " tt." & dbConfig.TT_ID_COLUMN_NAME & _
    " AND veh." & dbConfig.VEH_FT_ID_COLUMN_NAME & " = " & " ft." & dbConfig.FT_ID_COLUMN_NAME & _
    " AND veh." & dbConfig.VEH_COL_ID_COLUMN_NAME & " = " & " col." & dbConfig.COL_ID_COLUMN_NAME & _
    " AND veh." & dbConfig.VEH_ES_ID_COLUMN_NAME & " = " & " es." & dbConfig.ES_ID_COLUMN_NAME & _
    " AND veh." & dbConfig.VEH_MOD_ID_COLUMN_NAME & " = " & " mod." & dbConfig.MOD_ID_COLUMN_NAME & _
    " AND mod." & dbConfig.MOD_MKE_ID_COLUMN_NAME & " = " & " mke." & dbConfig.MKE_ID_COLUMN_NAME & _
    " AND veh." & dbConfig.VEH_ID_COLUMN_NAME & " = " & p_vehicleId

queryString = selectClause & fromClause & whereClause

Debug.Print queryString

conDb.Open dbConfig.DSN_NAME
rs.Open queryString, conDb

If Not IsNull(rs.Fields(dbConfig.VEH_ID_COLUMN_NAME).value) Then
    vehicle.id = CLng(rs.Fields(dbConfig.VEH_ID_COLUMN_NAME).value)
End If

If Not IsNull(rs.Fields(dbConfig.VEH_VIN_COLUMN_NAME).value) Then
    vehicle.vin = CStr(rs.Fields(dbConfig.VEH_VIN_COLUMN_NAME).value)
End If

If Not IsNull(rs.Fields(dbConfig.VEH_VRM_COLUMN_NAME).value) Then
    vehicle.vrm = CStr(rs.Fields(dbConfig.VEH_VRM_COLUMN_NAME).value)
End If

If Not IsNull(rs.Fields(dbConfig.MKE_ID_COLUMN_NAME).value) Then
    vehicle.makeId = CLng(rs.Fields(dbConfig.MKE_ID_COLUMN_NAME).value)
End If

If Not IsNull(rs.Fields(dbConfig.MKE_MAKE_COLUMN_NAME).value) Then
    vehicle.make = CStr(rs.Fields(dbConfig.MKE_MAKE_COLUMN_NAME).value)
End If

If Not IsNull(rs.Fields(dbConfig.MOD_ID_COLUMN_NAME).value) Then
    vehicle.modelId = CLng(rs.Fields(dbConfig.MOD_ID_COLUMN_NAME).value)
End If

If Not IsNull(rs.Fields(dbConfig.MOD_MODEL_COLUMN_NAME).value) Then
    vehicle.model = CStr(rs.Fields(dbConfig.MOD_MODEL_COLUMN_NAME).value)
End If

If Not IsNull(rs.Fields(dbConfig.ES_ID_COLUMN_NAME).value) Then
    vehicle.engineSizeId = CLng(rs.Fields(dbConfig.ES_ID_COLUMN_NAME).value)
End If

If Not IsNull(rs.Fields(dbConfig.ES_ENGINE_SIZE_COLUMN_NAME).value) Then
    vehicle.engineSize = CStr(rs.Fields(dbConfig.ES_ENGINE_SIZE_COLUMN_NAME).value)
End If

If Not IsNull(rs.Fields(dbConfig.FT_ID_COLUMN_NAME).value) Then
    vehicle.fuelTypeId = CLng(rs.Fields(dbConfig.FT_ID_COLUMN_NAME).value)
End If

If Not IsNull(rs.Fields(dbConfig.FT_FUEL_TYPE_COLUMN_NAME).value) Then
    vehicle.fuelType = CStr(rs.Fields(dbConfig.FT_FUEL_TYPE_COLUMN_NAME).value)
End If

If Not IsNull(rs.Fields(dbConfig.TT_ID_COLUMN_NAME).value) Then
    vehicle.transmissionId = CLng(rs.Fields(dbConfig.TT_ID_COLUMN_NAME).value)
End If

If Not IsNull(rs.Fields(dbConfig.TT_TRANSMISSION_TYPE_COLUMN_NAME).value) Then
    vehicle.transmission = CStr(rs.Fields(dbConfig.TT_TRANSMISSION_TYPE_COLUMN_NAME).value)
End If

If Not IsNull(rs.Fields(dbConfig.COL_ID_COLUMN_NAME).value) Then
    vehicle.colourId = CLng(rs.Fields(dbConfig.COL_ID_COLUMN_NAME).value)
End If

If Not IsNull(rs.Fields(dbConfig.COL_COLOUR_COLUMN_NAME).value) Then
    vehicle.colour = CStr(rs.Fields(dbConfig.COL_COLOUR_COLUMN_NAME).value)
End If

If Not IsNull(rs.Fields(dbConfig.CON_ID_COLUMN_NAME).value) Then
    vehicle.contactId = CLng(rs.Fields(dbConfig.CON_ID_COLUMN_NAME).value)
End If

rs.Close
conDb.Close
Set rs = Nothing
Set conDb = Nothing

Set getVehicleById = vehicle
Set vehicle = Nothing

End Function

这是上面代码生成的SQL:

调试打印:

SELECT * 
FROM   [vehicles$] veh, 
       [contacts$] con, 
       [refdata_transmission_types$] tt, 
       [refdata_fuel_types$] ft, 
       [refdata_colours$] col, 
       [refdata_makes$] mke, 
       [refdata_models$] mod, 
       [refdata_engine_sizes$] es 
WHERE  veh.veh_con_id = con.con_id 
       AND veh.veh_tt_id = tt.tt_id 
       AND veh.veh_ft_id = ft.ft_id 
       AND veh.veh_col_id = col.col_id 
       AND veh.veh_es_id = es.es_id 
       AND veh.veh_mod_id = mod.mod_id 
       AND mod.mod_mke_id = mke.mke_id 
       AND veh.veh_id = 1 

运行代码时出现以下错误:

谁能帮忙指出我做错了什么?

谢谢

【问题讨论】:

  • 将代码和错误消息作为文本发布,而不是作为图像发布。
  • 按要求发布信息。
  • 顺便说一句 - 我正在从另一个 Excel 工作表中查询一个 Excel 电子表格,以防我没有说清楚。无论如何,我很确定所有这些表都存在,因为我有其他代码正在从这些表中检索数据并且工作正常。当然,如果表不存在,那么它就不会抛出“语法错误”?
  • 请注意您使用的是已弃用的 SQL 语法,特别是隐式连接而不是显式连接(ANSI '92 标准)。考虑用INNER JOIN 替换WHERE 子句以提高可读性和清晰度。请参阅:stackoverflow.com/questions/44917/…

标签: sql excel vba join adodb


【解决方案1】:

已解决 -

我在我的 SQL 中使用 SQL 关键字作为别名,例如:

[refdata_models$] mod, 

我意识到“mod”是一个关键字。这造成了问题。我将别名更改为其他名称,现在可以正常工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多