2016-10-02 86 views
0

我用Excel &以下VBA是生成SQL語句代碼:Excel中VBA ADO SQL JOIN

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:

enter image description here

調試打印:

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 

當我運行代碼我a m到處以下錯誤:

enter image description here

有人能幫助指出什麼我做錯了嗎?

感謝

+2

將代碼和錯誤消息發佈爲文本,而不是將其作爲圖像發佈。 –

+0

根據要求發佈信息。 – Zahanghir

+0

順便說一句 - 我正在查詢另一張Excel表格中的Excel電子表格,以防萬一我沒有說清楚。無論如何,我非常肯定,所有這些表存在,因爲我有其他代碼從這些表中檢索數據,並正常工作。當然,如果一個表不存在,那麼它不會拋出'語法錯誤'? – Zahanghir

回答

0

解決 -

我使用一個SQL關鍵字作爲我的SQL別名,e.g:

[refdata_models$] mod, 

我意識到, '國防部' 是一個關鍵字。這就造成了這個問題。我將別名更改爲別的,現在工作正常。