如何修复 'ODCB call failed during OpenRecordSet'

How to fix 'ODCB call failed during OpenRecordSet'

我目前正在对现有的 Access(vba) 应用程序进行一些更改。但是突然间我 运行 进入 ODCB 调用失败错误,而 运行 一个 QueryDef。 table 链接到 SQL 服务器数据库。

我已经尝试通过链接的 table 管理器重置指向 table 的链接。 还调试以查看查询是否确实已定义以及其中的 SQL 是否正确。

    Call makePassThroughQuery("qryName", qSQL, True)
    Dim SQL As String
    SQL = "select * from qryName"
    Set rsNew = DB.OpenRecordset(SQL, dbOpenDynaset, dbSeeChanges)
    ' continue to use rsNew 

makePassThroughQuery 函数如下所示:

Function makePassThroughQuery(qryName As String, SQLString As String, 
             Optional isSQL As Boolean = True, 
             Optional ConnectString As String = "string", 
             Optional timeout As Integer = 120)

   Dim isTestingEnvironment As Boolean
   isTestingEnvironment = True
   If isSQL = False Then
     With CurrentDb
         On Error Resume Next
         .QueryDefs.Delete (qryName)
         On Error GoTo 0
         Dim qdfNew As Object
         Set qdfNew = .CreateQueryDef(qryName, SQLString)
         .Close
     End With

   Else
     Dim curDB As Database, curQdef As QueryDef
     '    Dim ConnectString As String
     'ConnectString = "string"
     Set curDB = CurrentDb
     On Error Resume Next
     CurrentDb.QueryDefs.Delete (qryName)
     On Error GoTo 0
     Set curQdef = curDB.CreateQueryDef(qryName)
     curQdef.Connect = ConnectString '& ";Returns Records=false;"
     curQdef.ODBCTimeout = timeout
     curQdef.sql = SQLString
     curQdef.Close

   End If
End Function

调用应该有效,因为这与我们对数据库进行大多数调用的方式相同,但不知何故此查询不起作用。

--编辑 根据要求,这是放置在 QueryDef 中的 SQL。

SELECT IIf([Brand]='Somebrand','SO',IIf(left([Brand],6)='SomeOtherBrand',IIf(CHARINDEX('168/2013', [WVTA])=0,'FOOBAR','BARFOO'),IIf([Brand]='Anotherbrand','BAR',IIf([Brand]='YetAnotherBrand','Foo','ander')))) AS Company,  
qtmpgetVINApprovalData.VIN, qtmpgetVINApprovalData.WVTA, qtmpgetVINApprovalData.Variant,  qtmpgetVINApprovalData.Version, qtmpgetVINApprovalData.NKS, qtmpgetVINApprovalData.productionDate AS Production, 
qtmpgetVINApprovalData.color, qtmpgetVINApprovalData.actualMass,  qtmpgetVINApprovalData.NKS_YYYY,qtmpgetVINApprovalData.NKS_SSSS, '' AS engine, qtmpgetVINApprovalData.EmisTestMassWLTP, 
qtmpgetVINApprovalData.FrontalAreaWLTP, qtmpgetVINApprovalData.RoadLoadCoefF0WLTP,  qtmpgetVINApprovalData.RoadLoadCoefF1WLTP, qtmpgetVINApprovalData.RoadLoadCoefF2WLTP, 
qtmpgetVINApprovalData.WLTPCOMBINED_REPORTING_CO2 AS CombinedCo2ConditionA,  qtmpgetVINApprovalData.WLTPCOMBINED_REPORTING_CO2 AS CombinedCo2ConditionB, 
qtmpgetVINApprovalData.WLTPCOMBINED_REPORTING_FC AS CombinedFuelConsConditionA,  qtmpgetVINApprovalData.WLTPCOMBINED_REPORTING_FC AS CombinedFuelConsConditionB, 
qtmpgetVINApprovalData.OVCEnergyConsPureElectric AS ElectricEnergyConsConditionA, qtmpgetVINApprovalData.OVCEnergyConsPureElectric AS ElectricEnergyConsConditionB,  
qtmpgetVINApprovalData.ElectricEnergyConsPureElectric , qtmpgetVINApprovalData.ElectricRange, OVCEnergyConsPureElectric, OVCRange, OVCRangeCity,  
qtmpgetVINApprovalData.OVCRange AS ElectricRangeExternChargeable, qtmpgetVINApprovalData.WLTPLowCO2, qtmpgetVINApprovalData.WLTPMediumCO2, qtmpgetVINApprovalData.WLTPHighCO2,  
qtmpgetVINApprovalData.WLTPExtraHighCO2, qtmpgetVINApprovalData.WLTPCombinedCO2, qtmpgetVINApprovalData.WLTPWeightedCombinedCO2, qtmpgetVINApprovalData.WLTPLowFuelConsumption,  
qtmpgetVINApprovalData.WLTPMediumFuelConsumption, qtmpgetVINApprovalData.WLTPHighFuelConsumption, qtmpgetVINApprovalData.WLTPExtraHighFuelConsumption, 
qtmpgetVINApprovalData.WLTPCombinedFuelCons,  qtmpgetVINApprovalData.WLTPWeightedCombinedFuelCons, 0 as WltpElecEnergyConsPureElectric,0 as WltpElectricRangePureElectric,
0 as WltpElectricRangeCityPureElec,0 as WltpElectEnergyConsExternCharg,  0 as WltpElectricRangeExternCharg,0 as WltpElectricRangeCityExtCharg, qtmpgetVINApprovalData.EMISSIONSTAGE, 
colorahosid, UrbanConditionsCO2, UrbanConditionsFuelConsumption, ExtraUrbanConditionsCO2,  ExtraUrbanConditionsFuelCons, CombinedCO2, CombinedConditionsFC, WeightedCombinedCO2, 
WeightedCombinedFuelCons, ElectricEnergyConsWeightedComb, ElectricRangeNEDC, ElectricRangeCity  FROM (SELECT DISTINCT     


CASE WHEN isnull(WLTPLowFuelConsumption,0)>15
THEN 'Error: Fuel consumption value too high'
ELSE
    CASE WHEN isnull(WLTPMediumCO2,0)>800
    THEN 'Error: WLTP Medium CO2 value too high'
    ELSE
        case when isnull(RoadLoadCoefF1WLTP,0)>1000
        THEN 'Error: RoadLoadCoeff too high'
        ELSE        
            case when isnull(qvtvv.tvvid,0)=0 
                THEN 'ERROR: TVV (PCOC) data missing' 
                ELSE                   
                case when isnull(qvtvv.eurolevel,'X')='X' 
                        THEN 'ERROR: EmissionLegislation Missing' 
                        ELSE                   
                        CASE when isnull(cocVINList.prodDate,'1900-01-01')='1900-01-01' 
                                THEN 'ERROR: Production Date Missing' 
                                ELSE                      
                                CASE when isnull(qvTVV.colorAHOSID,999)=999 
                                        THEN 'ERROR: Color missing' 
                                        ELSE
                                            CASE when isnull(nkstvv.wvta,'X')='X' 
                                                then    --NKS                    
                                                    case when isnull(nkstvv.wvta,'X')='X' 
                                                            then --NKS   
                                                            case when isnull(dbo.cocVINList.[actualMass],0)=0 
                                                                    THEN 'ERROR: Actual Mass missing'
                                                                    else 'OK'
                                                            END                       
                                                            else --BASE VEH  
                                                            case when isnull(NKS_PCOC.NKS_MassRunningOrder,0)=0 
                                                                    THEN 'ERROR: Actual Mass missing' 
                                                                    else 'OK'
                                                            END
                                                        end                       
                                                ELSE  
                                                    case when [WVTACOCLayoutVersions].description like '%2018%WLTP%' 
                                                            THEN 
                                                            case when isnull(EmisTestMassWLTP,0)=0 
                                                                    THEN 'ERROR: WLTP data missing' 
                                                                    else 'OK'
                                                            end
                                                            ELSE 'OK' 
                                                    END                    
                                            END                  
                                END                     
                        END              
                END
            END
        END
    END
END
as VALIDATION,   

dbo.cocVINList.VIN,        
dbo.cocVINList.NKS,             
case when isnull(nkstvv.wvta,'X')='X' then dbo.qvTVV.WVTA else nkstvv.wvta end as WVTA,           
case when isnull(nkstvv.Variant,'X')='X' then dbo.qvTVV.Variant else nkstvv.Variant end as Variant,          
case when isnull(nkstvv.Version,'X')='X' then dbo.qvTVV.Version else nkstvv.Version end as Version,             
case when isnull(nkstvv.wvta,'X')='X' then dbo.cocVINList.[actualMass] else NKS_PCOC.NKS_MassRunningOrder end as actualMass,             
case when isnull(nkstvv.wvta,'X')='X' then cocVINList.prodDate else NKS_PCOC.COC_Datum end as productionDate,             
case when isnull(nkstvv.wvta,'X')='X' then dbo.qvTVV.wvtadate else nkstvv.wvtadate end as WVTADate,             
qvTVV.color, qvTVV.colorAHOSID,              
qvTVV.Type_watermark_paper as Brand,     
case when isnull(nkstvv.wvta,'X')<>'X' THEN 
    case when charindex('2007/46',nkstvv.wvta)= 0 then qvtvv.NKS_YYYY END
END as NKS_YYYY,
case when isnull(nkstvv.wvta,'X')<>'X' THEN 
    case when charindex('2007/46',nkstvv.wvta)= 0 then qvTVV.NKS_SSSS END
END as NKS_SSSS,

 [EmisTestMassWLTP],             
 [FrontalAreaWLTP],             
 [RoadLoadCoefF0WLTP],             
 [RoadLoadCoefF1WLTP],             
 [RoadLoadCoefF2WLTP],             
 [CombinedConditionsCO2],             
 [CombinedConditionsFC],             
 [OVCEnergyConsPureElectric],             
 [OVCRange],             
 [OVCRangeCity],           
[ElectricEnergyConsPureElectric],    
         [ElectricRange],
         ElectricRangeCity,    
          [WLTPLowCO2],   

[WLTPMediumCO2],           
  [WLTPHighCO2],       
[WLTPExtraHighCO2],      
[WLTPCombinedCO2],   
[WLTPWeightedCombinedCO2],           
[WLTPLowFuelConsumption],     

[WLTPMediumFuelConsumption],            
[WLTPHighFuelConsumption],    
[WLTPExtraHighFuelConsumption],         
[WLTPCombinedFuelCons],       

[WLTPWeightedCombinedFuelCons],
ElectricEnergyConsWeightedComb,ElectricRangeNEDC,  
UrbanConditionsCO2, 
ExtraUrbanConditionsCO2, 
CombinedConditionsCO2 as CombinedCO2,    
UrbanConditionsFuelConsumption, 
ExtraUrbanConditionsFuelCons, 
WeightedCombinedCO2, 
WeightedCombinedFuelCons,             
case when [WLTPCombinedFuelCons]=0 
     THEN 
        CASE WHEN WLTPWeightedCombinedFuelCons=0 
             THEN NULL 
             ELSE WLTPWeightedCombinedFuelCons
        END 
     ELSE [WLTPCombinedFuelCons] 
END AS WLTPCOMBINED_REPORTING_FC ,             
case when [WLTPCombinedCO2]=0 
     THEN 
        CASE WHEN WLTPWeightedCombinedCO2=0 
             THEN NULL 
             ELSE WLTPWeightedCombinedCO2 
        END 
     ELSE [WLTPCombinedCO2]
END AS WLTPCOMBINED_REPORTING_CO2,              
case when isnull(EmisTestMassWLTP,0)>0 
     THEN 'WLTP' 
     else 
        case when [WVTACOCLayoutVersions].description like '%2018%WLTP%' 
             THEN 'WLTP' 
             ELSE 'NEDC' 
        END 
END AS EMISSIONSTAGE,             
qvtvv.EmissionLegislation  , qvTVV.fname
FROM dbo.qvTVV 
inner join cocvinlist on qvTVV.vin=cocvinlist.vin      
left join qvtvvshort NKSTVV on nkstvvid=nkstvv.tvvid      
left join [WVTATVV] on [WVTATVV].tvvid=qvtvv.tvvid      
left join [WVTACOCLayoutVersions] 
    on [VersionNr]=case when isnull(nkstvv.cat,'X')='X' 
                        then dbo.qvTVV.LayoutVersion 
                        else nkstvv.LayoutVersion 
                   end      
    and [WVTACOCLayoutVersions].cat=case when isnull(nkstvv.cat,'X')='X' 
                                         then left(dbo.qvTVV.cat+'   ',2) 
                                         else left(nkstvv.cat+'   ',2) 
                                    end      
    and [WVTACOCLayoutVersions].completion=case when isnull(nkstvv.cat,'X')='X' 
                                                then dbo.qvTVV.completion 
                                                else nkstvv.completion 
                                            end      
left join NKS_PCOC on NKS_PCOC.VIN=qvTVV.VIN 
WHERE 
dbo.cocVINList.vin in (select VIN from codap_exportvins where cuser ='USER.NAME')  
and case when [WVTACOCLayoutVersions].description like '%2018%WLTP%' then case when [EmisTestMassWLTP]=0 then 0 else 1 end else 1 end=1) as qtmpgetVINApprovalData where validation ='OK';

本质上,您是在混淆 SQL 方言。使用 DAO 的 Database.OpenRecordset 调用只能读取 MS Access SQL 方言(不是 SQL 服务器)的 Access 引擎。此操作将在 dbo.CASECHARINDEX 和其他人身上失败。

相反,考虑@ErikA 评论使用QueryDef.OpenRecordset 底层记录集,它将决定哪个后端SQL 引擎到运行:

Dim qdef As QueryDef
Set qdef = DB.QueryDefs("qryName")
Set rsNew = qdef.OpenRecordset(dbSeeChanges)
...

进一步阅读:SQL 服务器直通查询作为 Access 中 DAO 记录集的基础 .