“Недопустимое использование Пустого указателя” при использовании ул. () с полем Null Recordset, но ул. (Пустой указатель) хорошо работает

Я ударяю головой о стену на этом. Я смотрел на некоторый старый код создания отчетов базы данных, написанный в 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.

6
задан Mike Spross 7 May 2010 в 19:37
поделиться

3 ответа

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

6
ответ дан 8 December 2019 в 17:19
поделиться

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

If (rsSource!VehYear Is Nothing) Then
    ' Null
Else
    ' Not null
End If
0
ответ дан 8 December 2019 в 17:19
поделиться

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

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

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

1
ответ дан 8 December 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: