-
Есть БД Access с которой работает моя программа. В базе есть необязательное к заполнению поле типа Integer, назовем его N1. Мне нужно проверить, занес ли пользователь данные в это поле или нет. Делаю так:
if FieldByName('N1').AsVariant <> null then
FieldByName('N1').AsInteger... вычисляю что-то
все работает. Однако, если в дальнейшем пользователь сначала занес какое то число в это поле, а затем очистил это поле (для редактирования этого поля использую стандартный TDBEdit) то проверка на FieldByName('N1').AsVariant <> null не работает, потому как теперь FieldByName('N1').AsVariant равно не null, а ''. И получается: числового значения у этого поля нет, но оно и не null. Как в данном случае правильно проверять на наличие значения, чтобы избежать подобных проблем?
-
Обрабатывать BeforeInsert, а там проверять, что пользователь вставляет.
-
if (FieldByName('N1').AsVariant <> null) and (FieldByName('N1').AsString <> '') then
?
-
> потому как теперь FieldByName('N1').AsVariant равно не null, а '' что в общем то означает - в базе у поля тип "стринг", а не integer
-
> в базе у поля тип "стринг", а не integer
странно, но потом же он считает...
-
> странно, но потом же он считает... да нет проблем, считать будет смотря что и как. результат только может быть "слегка" неожиданным. к примеру CREATE TABLE aTable (N1 VarChar(10), N2 VarChar(10)) INSERT INTO aTable (N1,N2) VALUES (5, 6) <-не в кавычках, сработает автоприведение типа SELECT N1 + N2 AS [Sum] FROM aTable <- "сxитаем"... результат правда '56'? но ошибки то нет. а если через клиента считать т.е. через AsInteger то будут и правильные результаты... а вот значения '' в поле интеджер точно не может быть.
-
brother © (03.04.14 11:26) [2] > if (FieldByName('N1').AsVariant <> null) and (FieldByName('N1').AsString <> '') then можно просто if FieldByName('N1').AsString <> '' then т.к. null при приведении типа и так преобразуется в пустую строку.
-
FieldByName('N1').IsNull
-
Спасибо за ответы. Да понятно конечно, что можно так проверять if (FieldByName('N1').AsVariant <> null) and (FieldByName('N1').AsString <> '') then думал, что есть какое то более правильное решение.
"а вот значения '' в поле интеджер точно не может быть." - это собственно и привело в замешательство. Я тоже так считал. Кстати посмотрел реализацию сторонних компонент типа TDBIntegerEdit, так вот в них, в отличии от стандартного TDBEdit, когда значение едита пустое, записывается в поле не '', а именно null - там проверка на это есть.
"FieldByName('N1').IsNull"- а разве из IsNull и <> null - это не одно и тоже?
-
имхо isnull = 0 = null = ''
-
> когда значение едита пустое, записывается в поле не '', а именно null - там проверка на это есть. проверка не причем, ПОЛЕ В БАЗЕ не может сохранять значение '' если тип у него "число". только числа и null. т.что если ты при чтении получаешь '' - > теперь FieldByName('N1').AsVariant равно не null, а '' значит поле не числовое. а значит возможны "чудеса".
-
> имхо isnull = 0 = null = ''
"Них.я подобного!" (с) Шура Каретный 0 это значение=число, '' это пустая строка и все эти значения хоть и "пустые", но вполне определённые и их можно сравнивать и ими можно оперировать, а null это ОТСУТСТВИЕ значения. Не пустая строка, не 0, а НИКАКОЕ. В чём разница? Да вот в чём: Select Pole from Table where Pole >=0 выдаст все строки, КРОМЕ отрицательных и null ибо запрос должен всегда выбавать ТОЧНЫЙ результат, а поскольку значение null не определено, то эти записи в результат не попадут. И точно так же и в случае Select Pole from Table where Pole is null, выдаст только неопределённые (никакие) значения, а не 0 или ''. З.Ы. Поэтому правильно писать is null, а не = null, поскольку null ничему не равен.
-
мы говорили о привидении типов...
-
ересь какая. AsVariant возвращает вариант.
И чтобы проверить это значение надо юзать varisnull + varisempty
Тупое же сравнение варианта с null даст все что угодно, только не то что надо.
-
> мы говорили о привидении типов...
Да пофигу о чём вы говорили, человек явно не понимает логики SQL и отсюда такие вопросы
-
Есть поле в Датасете и обработчик события ОнЧенч. Есть поле-контрол на форме. Вероятно, вы обрабатываете ввод в контрол. Поле в датасете не пропустит значение не соотв-го типа. Вы запросто можете преобразовывать значение НУЛЛ к значению "пустая строка"/ Либо и то и другое к любому подходящему числу пр наличии желания.
|