"Недопустимое использование Null" при использовании Str () с полем набора записей Null, но Str (Null) отлично работает

я бьюсь головой об стену на этом. Я смотрел на какой-то старый код отчетности базы данных, написанный на VB6, и наткнулся на эту строку (код перемещает данные из "исходной" базы данных в базу данных отчетов):

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

, когда rsSource!VehYear is Null, вышеуказанная строка генерирует ошибку времени выполнения" недопустимое использование Null". Если я сломаю на вышеуказанной строке и введите следующее в непосредственной области:

?rsSource!VehYear

выводит Null. Отлично, это делает чувство. Затем я пытаюсь воспроизвести ошибку:

?Str(rsSource!VehYear)

я получаю ошибку" недопустимое использование Null".

однако, если я введу следующее В ближайшее окно:

?Str(Null)

я не получаю ошибку. Он просто выводит Null.

если я повторю тот же эксперимент с Trim() вместо Str() все работает нормально. ?Trim(rsSource!VehYear) возвращает Null, а не ?Trim(Null). Нет ошибок во время выполнения.

Итак, мой вопрос, как Str(rsSource!VehYear) возможно, бросьте ошибку "недопустимое использование Null", когда Str(Null) не, когда я знаю это rsSource!VehYear равна Null?


обновление: если я набираю следующее В окне Immediate, он работает так, как ожидалось (ошибка не возникает):

?Str(rsSource!VehYear.Value)

выводит Null. Теперь я знаю, что rsSource!VehYear на самом деле ADODB.Field экземпляр, но Value является свойством по умолчанию, поэтому Str должен работать на Value свойство (Null). Даже сообщение об ошибке ("недопустимое использование Null") предполагает, что Str получает Null параметр, но как он может лечить Null по-разному в одном случае, а не другой?

мое единственное предположение-внутренняя реализация Str() как-то не удается получить свойство по умолчанию, и ошибка "недопустимое использование Null" происходит по другой причине (что-то другое, чем параметр, вызывает "недопустимое использование Null", возможно, когда это попытка получить свойство по умолчанию из ).

у кого-нибудь есть более подробное, техническое объяснение того, что на самом деле здесь происходит?

короче:

?Str(rsSource!VehYear)

выдает ошибку "недопустимое использование Null", когда rsSource!VehYear is Null, а

?Str(rsSource!VehYear.Value)

возвращает Null.

, и Trim(rsSource!VehYear) и Trim(rsSource!VehYear.Value) возвращение Null.

4 ответов


функция Str будет специально проверять, передается ли значение Null, и обращаться с ним соответственно. Когда вы передаете объект, он пытается преобразовать результат метода по умолчанию в строку. Результат метода по умолчанию не передается в метод Str, но объект Field является, поэтому проверка исходного Null завершится ошибкой. Функция Str продолжит проверку типа параметра для типов данных, которые она поддерживает, когда она поймет, что у нее есть объект, она попытается получить значение по умолчанию. Он не пытается повторно обработать значение по умолчанию, как это было с переданным аргументом in, поэтому попытка вернуть Null в виде строки завершится неудачей. Похоже, MS не ожидала, что значение по умолчанию будет Null или любое другое недопустимое значение для Str. Например, Str также не поддерживает пустую строку.


Если вам нужно значение, отличное от строки, попробуйте использовать IsNull вместо:

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

Примечание 0 является значением по умолчанию


Это был мой обходной путь в vb6-days:

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

на &"" убедитесь, что всегда есть хотя бы пустая строка для работы.


из памяти поля базы данных null являются Nothing (или vbNull), которые не имеют тех же правил, что и Null. Вы должны просто быть в состоянии сделать быструю проверку:

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