У меня есть функция, которая по существу копирует записи и вставляет их с новыми идентификаторами. Код работает и все копируется нормально.

SQL, который происходит, по существу:

INSERT INTO myTable (ID, field, select) VALUES ('newID','stuff','')

Обратите внимание, что последнее значение пустое, пустое, нулевое и так далее. Иногда в нем что-то есть, иногда нет.

У меня есть проверка этого значения в форме доступа, и она использует isNull или isEmpty, и оба они получаются ложными, только с записями, которые вставляются таким образом.

Так что же вставляется, если ничего не вставляется? он не нулевой и не пустой, и там ничего нет, поэтому я совершенно сбит с толку. Если я что-то введу и сотру, все будет хорошо.

0
thomas 27 Ноя 2014 в 00:17
1
Каково определение таблицы myTable?
 – 
John Bollinger
27 Ноя 2014 в 00:20
Также обратите внимание, что для ANSI-совместимого SQL строка нулевой длины не совпадает с NULL. Таким образом, Access (и SQL Server) совместимы с ANSI, хотя некоторые основные базы данных — нет (в первую очередь Oracle). Кроме того, некоторые люди считают, что «пустая строка» означает нечто отличное от обоих: строку, содержащую только один или несколько пробелов.
 – 
John Bollinger
27 Ноя 2014 в 00:27
Рассматриваемое поле является varchar. Я не уверен насчет ANSI, но это может быть в правильном направлении. Я думаю, что это может быть ошибка в Access. Перед ним есть еще метод функции, но я распечатываю все возникающие операторы sql, и они не показывают никаких аномалий.
 – 
thomas
27 Ноя 2014 в 00:36
Вы пытались проверить пустую строку '' (2 одинарные кавычки)?
 – 
Beth
27 Ноя 2014 в 01:05
1
Кстати, выбор не очень хорошая идея для имени поля :-)
 – 
Mark3308
27 Ноя 2014 в 01:11

2 ответа

Функция IsEmpty() обычно используется только для проверки того, не была ли инициализирована переменная типа variant.

Можно сказать, что поле базы данных пусто, но это не то же самое, что если бы оно было пустым.

Например, если у вас есть поле с именем «Пол», которое не было обязательным полем в новой записи, значение может быть нулевым, тогда, если пользователь ввел женский пол, очевидно, это будет содержать значение. Если бы они тогда удалили слово «женщина», то поле теперь было бы пустым (не пустым).

Наиболее полезная функция при работе с нулевыми значениями в Microsoft Access следующая:

Nz()

Эта функция имеет два аргумента, первый из которых — это переменная, которую вы хотите проверить, а второй — значение, которое вы хотите вернуть, если переменная имеет значение Null. Например, следующее вернет пустую строку:

Dim variantName As Variant
variantName = Null
Debug.Print Nz(variantName,"")

Также обратите внимание, что если вы попытаетесь соединить переменную, содержащую Null, со строкой, используя символ плюса (+), это приведет к Null, что, вероятно, и является причиной возникновения проблем.

Здесь также показаны результаты попытки ввести следующее в немедленное окно:

? len(null)
Null

? len(null + "abc")
Null

? len(null & "abc")
3 
2
Mark3308 27 Ноя 2014 в 00:57
Таким образом, если запись из этой таблицы загружается в форму, то isEmpty() должна возвращать false для каждого поля, привязанного к любому столбцу записи. Если вы хотите проверить строку нулевой длины, сравните ее со строкой нулевой длины или проверьте длину строки. Возможно, вы захотите сначала обрезать пробелы с концов строки.
 – 
John Bollinger
27 Ноя 2014 в 00:42
Я ничего не делаю с полем, просто проверяю, является ли оно нулевым. изначально он использовал IsNull, и это работало, но не с записями, вставленными таким образом. Оно окажется ложным, поэтому я подумал, может быть, оно было пустым, и попробовал IsEmpty, но все равно выдал ложное. Итак, Access думает, что что-то есть ... пока я вручную не войду и не введу что-то, а затем не удалю это, тогда оно станет нулевым.
 – 
thomas
27 Ноя 2014 в 00:42
Опять же, строка нулевой длины — это не то же самое, что NULL (за исключением искаженных границ страны Оракула и, возможно, нескольких других странных мест). isNull("") вернет false в Access.
 – 
John Bollinger
27 Ноя 2014 в 00:43
Да, я согласен, isnull возвращает false, но и isEmpty возвращает false. Я только что сделал len(field) = 0, который возвращает false, затем я просто вывожу len(field) и ничего не выводит. может ли длина поля быть нулевой? не будет ли это значение по умолчанию, поскольку поле равно null? в противном случае это было бы 0, и это означало бы, что поле пусто. человек, это сводит с ума. Я думаю, что это ошибка доступа.
 – 
thomas
27 Ноя 2014 в 00:48
Если вы хотите подтвердить, что в элементе управления есть текст, и вам все равно, является ли он Null или пустым, следующий код вернет true : If Len(controlName & "")>0 Then
 – 
Mark3308
27 Ноя 2014 в 00:49

Может быть \r или \n или любым другим непечатаемым символом, вы можете выбрать такую ​​строку и преобразовать ее в varbinary, чтобы увидеть содержимое

-2
overflowed 27 Ноя 2014 в 00:22
Указывается строка нулевой длины, или так прямо сказано в вопросе. Нет никаких причин думать, что фактически вставленное значение вместо этого содержит управляющий символ.
 – 
John Bollinger
27 Ноя 2014 в 00:25
В вопросе говорится, что строка пустая, нулевая, пустая, что угодно. Пробел может означать, что он содержит пробелы (и не имеет нулевой длины), а строка нулевой длины — это не то же самое, что нуль, не говоря уже о том, что все это может означать. Так что я думаю, что мой намек все еще в силе.
 – 
overflowed
27 Ноя 2014 в 00:33