Я ударяю головой о стену на этом. Я смотрел на некоторый старый код создания отчетов базы данных, написанный в VB6, и столкнулся с этой строкой (код перемещает данные из "исходной" базы данных в базу данных создания отчетов):
rsTarget!VehYear = Trim(Str(rsSource!VehYear))
Когда rsSource!VehYear
Null
, вышеупомянутая строка генерирует "Недопустимое использование Пустой" ошибки времени выполнения. Если я повреждаюсь на вышеупомянутой строке и ввожу следующее в области Immediate:
?rsSource!VehYear
Это производит Null
. Прекрасный, который имеет смысл. Затем, я пытаюсь воспроизвести ошибку:
?Str(rsSource!VehYear)
Я получаю "Недопустимое использование Пустой" ошибки.
Однако, если я ввожу следующее в окно 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
). Даже сообщение об ошибке ("Недопустимое использование Пустого указателя") предлагает это Str
получает a Null
параметр, но как это может рассматривать Null
по-другому в одном случае а не другом?
Мое единственное предположение является внутренней реализацией Str()
так или иначе не удается получить свойство по умолчанию, и "Недопустимое использование Пустой" ошибки происходит по другой причине (что-то другое, чем параметр вызывает "Недопустимое использование Пустого указателя", возможно, когда это пытается получить свойство по умолчанию от Field
объект).
У кого-либо есть более подробное, техническое объяснение того, что на самом деле происходит здесь?
Короче говоря:
?Str(rsSource!VehYear)
бросает "Недопустимое использование Пустой" ошибки когда rsSource!VehYear
Null
, но
?Str(rsSource!VehYear.Value)
возвраты Null
.
Однако оба Trim(rsSource!VehYear)
и Trim(rsSource!VehYear.Value)
вернуть Null
.
Функция Str специально проверяет, передано ли значение Null, и обрабатывает его соответствующим образом. Когда вы передаете объект, он пытается преобразовать результат метода по умолчанию в String. Результат метода по умолчанию не передается в метод Str, но передается объект Field, поэтому проверка начального значения Null не удастся. Функция Str продолжит проверять тип параметра на типы данных, которые она поддерживает, когда она поймет, что у нее есть объект, она попытается получить значение по умолчанию. Он не пытается повторно обработать значение по умолчанию, как это было с переданным аргументом, поэтому попытка вернуть Null как String завершится ошибкой. Кажется, MS не ожидала, что значение по умолчанию будет Null или любым другим недопустимым значением для Str. Например, Str также не поддерживает пустую строку.
По памяти, пустые поля базы данных равны Ничего
(или, возможно, vbNull
), которые не имеют того же правила, применяемые к ним как Null
. Просто у вас должна быть возможность выполнить быструю проверку:
If (rsSource!VehYear Is Nothing) Then
' Null
Else
' Not null
End If
Это был мой обходной путь в vb6-days:
rsTarget!VehYear = Trim(Str(rsSource!VehYear & ""))
& "" всегда проверяет наличие хотя бы одного пустая строка для работы.