2010-05-06 4 views
5

머리에 벽을 두드리는 중입니다. 내가 VB6로 작성 오래된 데이터베이스보고 코드를보고 (코드는보고 데이터베이스에 "소스"데이터베이스에서 데이터를 이동)이 라인을 가로 질러왔다되었습니다Str()을 Null Recordset 필드와 함께 사용할 때 "Null 사용이 잘못되었습니다."하지만 Str (Null)이 정상적으로 작동합니다.

rsTarget!VehYear = Trim(Str(rsSource!VehYear)) 

rsSource!VehYearNull, 위의 라인 "Null 잘못된 사용"런타임 오류를 생성합니다. 나는 위의 줄에 중단하고 입력하면 직접 실행 창에서 다음

?rsSource!VehYear 

Null를 출력합니다. 좋아, 그건 의미가있다. 다음으로 오류를 재현 해 봅니다.

?Str(rsSource!VehYear) 

"잘못된 Null 사용"오류가 발생합니다. 내가 직접 실행 창에 다음과 같이 입력하면

그러나 :

?Str(Null) 

I 오류가 발생하지 않습니다. 단순히 Null을 출력합니다.

Str() 대신 Trim()과 동일한 실험을 반복하면 모든 것이 정상적으로 작동합니다. ?Trim(rsSource!VehYear)?Trim(Null)과 마찬가지로 Null을 반환합니다. 런타임 오류가 없습니다.

그래서, 내 질문은, 어떻게 Str(rsSource!VehYear) 가능성이 때 Str(Null), 때 rsSource!VehYearNull 동일 것을 알고 하지 않는 오류에 "널의 잘못된 사용을"던질 수 있습니까?


업데이트 : 내가 직접 실행 창에 다음을 입력하면 예상대로 작동 (오류가 발생하지 않음) :

?Str(rsSource!VehYear.Value) 

Null를 출력합니다. 이제 rsSource!VehYearADODB.Field 인스턴스이지만 실제로는 Value이 기본 속성이므로 속성 (Null)에서 Str이 작동해야합니다. 심지어 오류 메시지 ("Null의 유효하지 않은 사용")은 StrNull 매개 변수를 받고 있음을 나타내지 만 어떻게 Null을 다른 경우가 아닌 다른 방법으로 처리 할 수 ​​있습니까?

내 생각에 Str()의 내부 구현은 기본 속성을 가져 오지 못하고 "다른 곳에서 Null 오류가 발생했습니다"오류가 발생합니다 (매개 변수 이외의 다른 것이 "잘못된 사용"을 유발 함). Null ", 아마도 Field 개체에서 기본 속성을 검색하려고 할 때).

여기 실제로 일어나는 일에 대해 더 자세한 기술 설명이있는 사람이 있습니까?

한마디로

: rsSource!VehYearNull

?Str(rsSource!VehYear) 

오류에 "널의 잘못된 사용을"가 발생하지만,

?Str(rsSource!VehYear.Value) 

반환 Null.

그러나 Trim(rsSource!VehYear)Trim(rsSource!VehYear.Value)은 모두 Null입니다.

답변

5

Str 함수는 Null 값이 전달되고 그에 따라 처리되는지 여부를 구체적으로 확인합니다. 오브젝트를 건네 주면 (자), 디폴트의 메소드의 결과를 String로 변환하려고합니다. 기본 메서드의 결과는 Str 메서드로 전달되지 않지만 Field 개체가 반환되므로 초기 Null에 대한 검사가 실패합니다. Str 함수는 오브젝트가 있음을 인식하면 지원하는 데이터 유형에 대한 매개 변수 유형을 계속 점검하여 기본값을 검색하려고 시도합니다. 전달 된 인수를 사용했을 때처럼 기본값을 다시 처리하지 않으므로 Null을 String으로 반환하려는 시도는 실패합니다. 그것은 MS가 Null이나 Str에 대한 다른 잘못된 값이 될 것으로 기대하지 않았던 것 같습니다. 예를 들어, Str은 빈 문자열을 지원하지 않습니다. 당신이 문자열이 아닌 다른 값이 필요한 경우

+0

그것은 물건을 깨끗하게합니다. 그건 그렇고, SimplyVBUnit 주셔서 감사합니다;) –

0

메모리에서 null 데이터베이스 필드는 Nothing (또는 가능하게는 vbNull)이며 Null과 동일한 규칙이 적용되지 않습니다. 당신은 빠른 검사를 할 수 있어야한다 :

If (rsSource!VehYear Is Nothing) Then 
    ' Null 
Else 
    ' Not null 
End If 
+0

좋은 제안이지만, 필드 Null''에 확실히 동일합니다. IDE에서 그 위에 마우스를 올려 놓고 직접 실행 창에 출력 해 보았습니다. –

1

이 있었다 VB6-일 내 해결 방법 :

rsTarget!VehYear = Trim(Str(rsSource!VehYear & "")) 

& ""에 allways 적어도이 있는지 확인합니다 사용할 빈 문자열

+0

제가이 문제를 해결할 수 있다는 것을 알고 있습니다.이 경우 실제로 데이터베이스 필드가 실제로 숫자 필드이므로'Trim'과'Str'에 대한 호출을 모두 제거 할 수 있습니다. 질문의 코드가 예상대로 작동하지 않는 기술적 인 이유에 더 관심이 있습니다. –

6

대신 ISNULL을 사용해보십시오 :

rsTarget!VehYear = IIf(IsNull(rsSource!VehYear), 0, rsSource!VehYear) 

'참고 0은 디폴트 값을