Конференция "Базы" » Значение незаполненного поля - null?
 
  • Alex_C (03.04.14 11:03) [0]
    Есть БД Access с которой работает моя программа. В базе есть необязательное к заполнению поле типа Integer, назовем его N1. Мне нужно проверить, занес ли пользователь данные в это поле или нет. Делаю так:

    if FieldByName('N1').AsVariant <> null then
     FieldByName('N1').AsInteger... вычисляю что-то


    все работает. Однако, если в дальнейшем пользователь сначала занес какое то число в это поле, а затем очистил это поле (для редактирования этого поля использую стандартный TDBEdit) то проверка на FieldByName('N1').AsVariant <> null не работает, потому как теперь FieldByName('N1').AsVariant равно не null, а ''. И получается: числового значения у этого поля нет, но оно и не null. Как в данном случае правильно проверять на наличие значения, чтобы избежать подобных проблем?
  • Ega23 © (03.04.14 11:17) [1]
    Обрабатывать BeforeInsert, а там проверять, что пользователь вставляет.
  • brother © (03.04.14 11:26) [2]
    if (FieldByName('N1').AsVariant <> null) and (FieldByName('N1').AsString <> '') then

    ?
  • sniknik © (03.04.14 11:38) [3]
    > потому как теперь FieldByName('N1').AsVariant равно не null, а ''
    что в общем то означает - в базе у поля тип "стринг", а не  integer
  • brother © (03.04.14 11:41) [4]
    > в базе у поля тип "стринг", а не  integer

    странно, но потом же он считает...
  • sniknik © (03.04.14 12:01) [5]
    > странно, но потом же он считает...
    да нет проблем, считать будет смотря что и как. результат только может быть "слегка" неожиданным.
    к примеру
    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 то будут и правильные результаты... а вот значения '' в поле интеджер точно не может быть.
  • sniknik © (03.04.14 12:07) [6]
    brother ©   (03.04.14 11:26) [2]
    > if (FieldByName('N1').AsVariant <> null) and (FieldByName('N1').AsString <> '') then
    можно просто
    if FieldByName('N1').AsString <> '' then
    т.к. null при приведении типа и так преобразуется в пустую строку.
  • turbouser © (03.04.14 12:27) [7]
    FieldByName('N1').IsNull
  • Alex_C (03.04.14 12:57) [8]
    Спасибо за ответы.
    Да понятно конечно, что можно так проверять
    if (FieldByName('N1').AsVariant <> null) and (FieldByName('N1').AsString <> '') then
    думал, что есть какое то более правильное решение.

    "а вот значения '' в поле интеджер точно не может быть."
    - это собственно и привело в замешательство. Я тоже так считал. Кстати посмотрел реализацию сторонних компонент типа TDBIntegerEdit, так вот в них, в отличии от стандартного TDBEdit, когда значение едита пустое, записывается в поле не '', а именно null - там проверка на это есть.

    "FieldByName('N1').IsNull"-
    а разве из IsNull и <> null - это не одно и тоже?
  • brother © (03.04.14 13:00) [9]
    имхо isnull = 0 = null = ''
  • sniknik © (03.04.14 13:25) [10]
    > когда значение едита пустое, записывается в поле не '', а именно null - там проверка на это есть.
    проверка не причем, ПОЛЕ В БАЗЕ не может сохранять значение '' если тип у него "число". только числа и null.
    т.что если ты при чтении получаешь '' -
    > теперь FieldByName('N1').AsVariant равно не null, а ''
    значит поле не числовое. а значит возможны "чудеса".
  • Труп Васи Доброго © (03.04.14 13:33) [11]

    > имхо 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 ничему не равен.
  • brother © (03.04.14 14:22) [12]
    мы говорили о привидении типов...
  • это все ... (03.04.14 17:12) [13]
    ересь какая.
    AsVariant возвращает вариант.

    И чтобы проверить это значение надо юзать varisnull + varisempty

    Тупое же сравнение варианта с null даст все что угодно, только не то что надо.
  • Труп Васи Доброго © (04.04.14 23:22) [14]

    > мы говорили о привидении типов...

    Да пофигу о чём вы говорили, человек явно не понимает логики SQL и отсюда такие вопросы
  • Дмитрий (10.04.14 15:37) [15]
    Есть поле в Датасете и обработчик события ОнЧенч.
    Есть поле-контрол на форме.
    Вероятно, вы обрабатываете ввод в контрол.
    Поле в датасете не пропустит значение не соотв-го типа.
    Вы запросто можете преобразовывать значение НУЛЛ к значению "пустая строка"/
    Либо и то и другое к любому подходящему числу пр наличии желания.
 
Конференция "Базы" » Значение незаполненного поля - null?
Есть новые Нет новых   [118470   +29][b:0][p:0.001]