Поиск записи с NULL в SQlite

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Поиск записи с NULL в SQlite

Сообщение artem78 » 13.10.2021 23:01:20

Имеется база данных SQlite3 с таблицей:
Код: Выделить всё
CREATE TABLE periods (
   id AUTOINC_INT PRIMARY KEY,
   begin DATETIME,
   end DATETIME,
   task_id INTEGER)


Нужно найти первую запись с end=NULL. Делаю следующем образом:
Код: Выделить всё
procedure TMainForm.StopToolButtonClick(Sender: TObject);
begin
  with DataModule1.PeriodsDataset do
  begin
    if Locate('end', Nil, []) then
    begin
      // что-то делаем...
    end;
  end;
end;   


При выполнении Locate происходит исключение "Invalid variant type cast". Замена Nil на пустую строку или строку 'NULL' даёт тот же результат.
artem78
новенький
 
Сообщения: 43
Зарегистрирован: 09.08.2015 18:52:24

Re: Поиск записи с NULL в SQlite

Сообщение Снег Север » 14.10.2021 16:27:43

Параметр номер два должен иметь тип Variant. Для значения NULL можно использовать функцию Null.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Поиск записи с NULL в SQlite

Сообщение wavebvg » 14.10.2021 18:17:44

Код: Выделить всё
uses
  Variant;
wavebvg
постоялец
 
Сообщения: 354
Зарегистрирован: 28.02.2008 04:57:35

Re: Поиск записи с NULL в SQlite

Сообщение artem78 » 14.10.2021 19:18:03

Сделал, как вы сказали. Ничего не изменилось.

Видимо, кроме типа TDateTime ничего другого не воспринимает. Может на NULL следует проверять по-другому?
artem78
новенький
 
Сообщения: 43
Зарегистрирован: 09.08.2015 18:52:24

Re: Поиск записи с NULL в SQlite

Сообщение iskander » 15.10.2021 08:54:44

Locate() совсем от рук отбился?
И как обычно, предлагается воспользоваться хрустальным шаром или сделать компилируемый пример самостоятельно?

Ладно, попробую сделать пример самостоятельно.

Добавлено спустя 26 минут 39 секунд:
Ложная тревога, однако.
Всё вроде работает как положено.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Поиск записи с NULL в SQlite

Сообщение artem78 » 15.10.2021 20:18:23

Про шар было очень остроумно. Держите весь код проекта и увидите сами (модуль tasks, 104-я строка):
TasksOrganizer.zip
У вас нет необходимых прав для просмотра вложений в этом сообщении.
artem78
новенький
 
Сообщения: 43
Зарегистрирован: 09.08.2015 18:52:24

Re: Поиск записи с NULL в SQlite

Сообщение iskander » 15.10.2021 20:41:14

artem78 писал(а):Про шар было очень остроумно...

Рад, что вам понравилось, на это и надеялся.
artem78 писал(а):...Держите весь код проекта и увидите сами (модуль tasks, 104-я строка)

Воля ваша, конечно, но теперь разве что в качестве сувенира.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Поиск записи с NULL в SQlite

Сообщение artem78 » 15.10.2021 20:54:49

Вообще-то, я просил помочь, а не острить. Не понимаю, почему у меня не работает - на первый взгляд, всё тоже самое, что и в вашем примере.
artem78
новенький
 
Сообщения: 43
Зарегистрирован: 09.08.2015 18:52:24

Re: Поиск записи с NULL в SQlite

Сообщение iskander » 15.10.2021 21:25:55

Ну причём здесь остроты, просто вопросы задаваемые про код без самого кода смысла особо не имеют, я обычно прохожу мимо таких. Но вам не повезло, уж какая-то сильно загадочная ситуация получалась.Теперь вот выясняется что это TSqlite3Dataset. Ничего не могу сказать про TSqlite3Dataset кроме того, что достаточно много лет назад пытался его использовать и бросил по причине косяков. Постараюсь посмотреть на выходных, если будет время.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Поиск записи с NULL в SQlite

Сообщение artem78 » 15.10.2021 21:37:47

iskander писал(а): вопросы задаваемые про код без самого кода

Ещё в первом сообщении он был.

iskander писал(а):Ничего не могу сказать про TSqlite3Dataset кроме того, что достаточно много лет назад пытался его использовать и бросил по причине косяков.

А что можете посоветовать из альтернатив? Я с БД в паскале раньше не работал.

iskander писал(а):Постараюсь посмотреть на выходных, если будет время.

Спасибо.
artem78
новенький
 
Сообщения: 43
Зарегистрирован: 09.08.2015 18:52:24

Re: Поиск записи с NULL в SQlite

Сообщение Снег Север » 15.10.2021 22:35:01

artem78 писал(а):А что можете посоветовать из альтернатив?

SQLdb в моих задачах нормально работает с Sqlite.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Поиск записи с NULL в SQlite

Сообщение iskander » 15.10.2021 23:24:12

artem78 писал(а):
iskander писал(а): вопросы задаваемые про код без самого кода

Ещё в первом сообщении он был.

Ну, значит у меня не получилось достучаться.
Под кодом я понимаю то, что можно скомпилировать и запустить. Вот можно было из этого вашего "кода" понять, что речь идёт о TSqlite3Dataset?
А у него Locate() действительно падает с EVariantTypeCastError где-то в недрах TCustomSqliteDataset.

Можно попробовать обойтись как-нибудь без Locate:
Код: Выделить всё
procedure TTasksFrame.StopTrackingToolButtonClick(Sender: TObject);
var
  NullEndFound: Boolean = False;
begin
  with DataModule1.PeriodsDataset do
  begin
    First;
    while not EOF do begin
      if FieldByName('end').IsNull then begin
        NullEndFound := True;
        break;
      end;
      Next;
    end;
    if NullEndFound then begin
      Edit;
      FieldByName('end').AsDateTime := Now;
      Post;
      ApplyUpdates;
    end;
    //if Locate('end', Null(), []) then
    //begin
    //  Edit;
    //  FieldByName('end').AsDateTime := Now;
    //  Post;
    //  ApplyUpdates;
    //end;
  end;
end;


artem78 писал(а):А что можете посоветовать из альтернатив? Я с БД в паскале раньше не работал.

Пожалуй, для Sqlite тоже проголосую за Sqldb.
artem78 писал(а):Спасибо.

Да не за что.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Поиск записи с NULL в SQlite

Сообщение artem78 » 16.10.2021 13:53:25

iskander писал(а):Под кодом я понимаю то, что можно скомпилировать и запустить. Вот можно было из этого вашего "кода" понять, что речь идёт о TSqlite3Dataset?

Код проекта целиком не каждый вам даст. И откуда мне было знать, что данного мною фрагмента недостаточно и дело в использовании TSqlite3Dataset? Не будем больше продолжать спор.

iskander писал(а):SQLdb

Попробую вечером.
artem78
новенький
 
Сообщения: 43
Зарегистрирован: 09.08.2015 18:52:24

Re: Поиск записи с NULL в SQlite

Сообщение Vadim » 17.10.2021 05:30:15

artem78 писал(а):И откуда мне было знать, что данного мною фрагмента недостаточно и дело в использовании TSqlite3Dataset?

А то, что во FreePascal не один компонент для доступа к БД Вы, конечно же, тоже никогда не знали? ;-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Поиск записи с NULL в SQlite

Сообщение iskander » 17.10.2021 10:31:13

artem78 писал(а):...Не будем больше продолжать спор.

Кажется, я что-то упустил. А кто с кем спорил?
artem78 писал(а):Код проекта целиком не каждый вам даст...

Да вы просто герой какой-то, я определённо чувствую себя польщённым. Пойду надену красную рубаху.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 40

Рейтинг@Mail.ru