2017-06-06 93 views
0

我尝试运行这段代码VBA的访问错误91

Public Sub Production_UpdateStatus(ByVal lngProductionId As Long, _ 
            ByVal NewProductionStatus As eProductionStatus)  
Dim oDb As DAO.Database 
Dim oRst As DAO.Recordset 
Dim StrSql As String 
Dim strProductionStatus As String 

On Error GoTo Err_Infos 

GetCurrentProductionStatusString NewProductionStatus, strProductionStatus 

Set oDb = CurrentDb 

'Mise a jour du staut de production 
StrSql = "UPDATE tProduction SET tProduction.Statut= '" & strProductionStatus & "'" _ 
      & " WHERE (tProduction.IdProduction=" & lngProductionId & ");" 
oDb.Execute StrSql 

'Fermeture des connexions 
oRst.Close 
oDb.Close 
Set oDb = Nothing 
Set oRst = Nothing 

Exit_currentSub: 
    Exit Sub 

Err_Infos: 
    MsgBox "Erreur #" & Err.Number & " : " & Err.Description 
    Resume Exit_currentSub 

End Sub 

此代码的工作,但给我的错误91.

对象变量或带块变量未设置

它生成以下SQL查询:

UPDATE tProduction SET tProduction.Statut= 'Nouvelle' WHERE (tProduction.IdProduction=2); 

当我测试直接查询时,我没有任何错误。你能帮我消除这个错误吗?

谢谢

+0

什么错误? –

+2

删除oRst.Close并设置oRst =没有行。 oRst未初始化并导致错误,但您不需要此代码的oRst。 – RADO

+0

这个错误是否发生在'oDb.Execute StrSql'上? VBA中不需要分号,尽管我不认为这是因为这里的原因。 –

回答

3

您正在关闭一个记录集对象oRst,该对象从未使用Set进行过初始化。因为你运行一个动作查询,你不需要一个记录集,它可能与以前的代码版本有关。

在那相同的音符,因为要传递文字值的SQL查询,考虑DAO QueryDef parameters参数化,避免级联和报价机箱:

Dim oDb As DAO.Database, qdef As DAO.QueryDef 
Dim StrSql As String, strProductionStatus As String 

GetCurrentProductionStatusString NewProductionStatus, strProductionStatus 

Set oDb = CurrentDb 

StrSql = "PARAMETERS strProductionStatusParam Text(255), lngProductionIdParam Long;" _ 
      & " UPDATE tProduction SET tProduction.Statut = [strProductionStatusParam]" _ 
      & " WHERE (tProduction.IdProduction = [lngProductionIdParam]);" 

Set qdef = oDb.CreateQueryDef("", StrSql) 

qdef!strProductionStatusParam = strProductionStatus 
qdef!lngProductionIdParam = lngProductionId 

qdef.Execute dbFailOnError 

Set qdef = Nothing 
Set oDb = Nothing 
+0

你应该能够设置该对象什么也不做,即使Recordset没有被实例化。唯一需要注意的是类型必须是一个“对象”,因为您无法将未声明的类型设置为无效。虽然RecordSet应该被删除,因为它在这里没有被使用。 –

+3

@JimmySmith问题不在于将其设置为“Nothing”。问题是在空引用上调用实例方法'Close'。也可以在直接窗格中试试这个:'Set foo = Nothing',然后'?IsObject(foo)'。按照定义,输出“True”和“foo”未声明。 –

+0

A-ha。我在那里误解了。是的,.Close会杀死它,因为它在技术上没有任何内容。关闭以引用。因为他们从未指定错误发生的位置,所以在这里您可能是正确的答案。 –

1

尝试删除oRst相关的代码行。这个变量没有被初始化,也没有被使用。