«Недопустимое использование Null» при использовании Str () с полем Null Recordset, но Str (Null) работает нормально - PullRequest
6 голосов
/ 07 мая 2010

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

Ответы [ 4 ]

7 голосов
/ 20 февраля 2012

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

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

'Примечание 0 - это значение по умолчанию

6 голосов
/ 11 мая 2010

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

1 голос
/ 07 мая 2010

Это был мой обходной путь за последние 6 дней:

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

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

0 голосов
/ 07 мая 2010

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

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