"Недопустимое использование 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