2015-02-04 2 views
1

VBA 프로그램의 일부가 SQL 서버를 쿼리하고 특정 데이터를 반환하는 프로그램이 있습니다. 문제는 데이터가 반드시 항상 존재하는 것은 아니며 예상된다는 것입니다. 특정 데이터를 요청하는 데이터베이스를 쿼리해야하며, 그렇지 않은 경우 프로그램에서이를 무시하고 계속 진행하기를 원합니다. 불행히도 데이터없이 레코드를 조회하면 다음과 같은 오류가 발생합니다.VBA에서 결과가없는 sql 쿼리에 대한 대안이 있습니까?

Run-time error '3021':
Either BOF or EOF is True, or the current record has been deleted.

a.k.a. 레코드가 없습니다. 방법이

  1. 데이터가 존재하는 결정을하거나, 또는
  2. 그냥 오류가 아닌 널 (null) 문자열/레코드/아무것도을 반환 한 오류에 사용하지 않고 있습니까?

답변

1

결과 레코드 세트의 필드 값에 액세스하기 전에 .EOF의 레코드 세트인지 확인하거나 레코드 수를 묻습니다. 빈 레코드 세트를 열면 오류가 발생하지 않으며 레코드에 액세스하면 오류가 발생합니다.

코드를 보지 않고 (레코드 세트 열기에서 시작) 더 이상 구체적인 제안을 쓰지 않습니다.

4

열린 레코드 집합으로 이동하기 전에 레코드 집합에 레코드가 있는지 확인하기 위해 RecordCount/EOF를 테스트해야합니다.

Public Sub TestRS() 
    Dim rsObj As DAO.Recordset 

    Set rsObj = CurrentDB.OpenRecordset("SELECT FieldName1, FieldName2 FROM tableName WHERE someID = 10") 

    If rsObj.RecordCount < 1 Then 
     MsgBox "No Records." 
     'You can also test using one of the following. 
     'If Not (rsObj.BOF And rsObj.EOF) Then 
    Else 
     MsgBox "There are more than one Record." 
    End If 
    Set rsObj = Nothing 
End Sub 
+0

브릴리언트, 완전히 나는'recordcount' 속성이 사용중인 RDBMS에 따라 항상 정확하지 않은 점에 유의 단지 것 .recordcount 부동산 – smpat04

+0

잊었다. 개인적으로'If Not rsObj.EOF'를 사용하는 것을 선호합니다. 파일의 시작 부분에 있어도 상관이 없으므로, 끝까지 지나치는 것을 원하지 않습니다. – RubberDuck

+1

@RubberDuck 내가 아는 한, 레코드 집합에 레코드가있는 경우 .RecordCount는 항상> 0을 반환하므로 테스트가 정확합니다. 그러나 레코드 세트가 실제 채워지는 실제 레코드 수를 얻으려면 올바른 것입니다. –