Я бью головой об стену на этом. Я просматривал какой-то старый код отчетности базы данных, написанный на VB6, и наткнулся на эту строку (код перемещает данные из «исходной» базы данных в базу данных отчетов):
rsTarget!VehYear = Trim(Str(rsSource!VehYear))
Когда rsSource!VehYear
равно Null
, приведенная выше строка генерирует ошибку времени выполнения «Недопустимое использование нулевого значения». Если я сломаю строку выше и введу следующее в панели «Немедленно»:
?rsSource!VehYear
Выводит Null
. Хорошо, это имеет смысл. Далее я пытаюсь воспроизвести ошибку:
?Str(rsSource!VehYear)
Я получаю ошибку "Недопустимое использование Null".
Однако, если я наберу следующее в окне Immediate:
?Str(Null)
Я не получаю ошибку. Он просто выводит Null
.
Если я повторяю тот же эксперимент с Trim()
вместо Str()
, все работает нормально. ?Trim(rsSource!VehYear)
возвращает Null
, как и ?Trim(Null)
. Нет ошибок во время выполнения.
Итак, мой вопрос: как Str(rsSource!VehYear)
может вызвать ошибку "Недопустимое использование нулевого значения", если 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 ", возможно, когда он пытается получить свойство по умолчанию из объекта Field
).
У кого-нибудь есть более подробное, техническое объяснение того, что на самом деле здесь происходит?
Короче говоря:
?Str(rsSource!VehYear)
выдает ошибку «Недопустимое использование нулевого значения», когда rsSource!VehYear
равен Null
, но
?Str(rsSource!VehYear.Value)
возвращает Null
.
Однако оба Trim(rsSource!VehYear)
и Trim(rsSource!VehYear.Value)
возвращают Null
.