Автоматическая временная метка Sqlite - вставить, а затем отобразить в сетке с поддержкой БД

У меня есть некоторый опыт работы с MySql, и я впервые перехожу на Sqlite.

В документации Sqlite для типов данных, раздел 1.2, говорится, что

SQLite не имеет класса хранения, выделенного для хранения дат и/или времени. Вместо этого встроенные функции даты и времени SQLite способны хранить даты и время в виде значений TEXT, REAL или INTEGER.

Я бы предпочел автоматическую временную метку, но буду жить с необходимостью передавать ее каждый раз, если она заставит мой код работать.

Следуя этому вопросу, я объявил свое поле как

`time_stamp` TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL, 

Однако он ничего не отображает в сетке СУБД.

Я добавил OnDrawCell() и подумал, что это может помочь:

   var cellText : String;
       cellValue : String;
       dateTime : TDateTime;
begin
   if ARow = 0 then
      Exit;

      cellValue := myGrid.Cells[ACol, ARow];

   case ACol of
      0: ; // invisibe column, do nothing
      1: cellText := cellValue;
      2: begin
            dateTime := StrToDateTime(cellValue);
            cellText := DateTimeToStr(dateTime);
         end;
      3: cellText := cellValue;
      4: cellText := cellValue;
   end;

   myGrid.Canvas.FillRect(Rect);
   myGrid.Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, cellText);

где столбец 2 - моя временная метка, но, по-видимому, он пуст.

Итак, мой вопрос: может ли кто-нибудь исправить этот фрагмент кода или показать мне пример кода, как объявить столбец Sqlite, который по умолчанию использует текущую отметку времени, и как отобразить это в сетке с поддержкой БД? Я достаточно рад сохранить временную метку Unix, если это поможет.

Кстати, я использую XE7, FireDac с TMS TAdvDbGrid.


[Обновление] Как упоминалось в ветке комментариев ниже (и, как, возможно, должно было быть упомянуто изначально), в этом случае я генерирую некоторые фиктивные данные для тестирования морских свиней, используя TDateTime и IncSecond(startTime, delay * i). Итак, по сути, я пишу TDateTime в это поле, затем закрываю/открываю источник данных, и отображаются все остальные поля новой строки, но не это.

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


person Mawg says reinstate Monica    schedule 21.03.2015    source источник
comment
FireDAC использует mapping to pseudo types. Поэтому определите свое поле как DATETIME. Тип данных TIMESTAMP FireDAC сопоставляется с типом данных dtDateTimeStamp (поэтому вы, вероятно, не сможете получить правильный вывод).   -  person TLama    schedule 22.03.2015
comment
@TLama Спасибо (+1), но это сбивает с толку медведя с очень маленьким мозгом. Можете ли вы опубликовать конкретный ответ?   -  person Mawg says reinstate Monica    schedule 22.03.2015
comment
Как вы вставляете новую запись?   -  person crefird    schedule 22.03.2015


Ответы (1)


Вы ищете не в том месте, ваша проблема в наборе данных. Это общая проблема для всех наборов данных, которые получают данные из внешней базы данных.

Ваш запрос/набор данных имеет копию данных в вашей базе данных. Он получает эту копию из базы данных, когда она открывается или когда вы используете ее для обновления/вставки записей в базу данных. Если данные в базе данных изменены каким-либо другим образом, в вашем наборе данных не будет этих изменений до тех пор, пока измененные записи не будут перечитаны. Это относится к вам, потому что значение метки времени устанавливается в базе данных, а не через набор данных. Это можно сделать, закрыв, а затем открыв набор данных.

С помощью FireDAC попробуйте установить файл UpdateOptions .RefreshMode := rmAll запроса. У меня это сработало, когда в запросе есть одна таблица, то есть нет соединений.

person crefird    schedule 22.03.2015
comment
Таким образом, сетка может правильно отображать поле типа dtDateTimeStamp? Потому что именно так должен отображаться столбец типа TIMESTAMP согласно справке. Но вы правы, кортеж должен быть повторно выбран, чтобы увидеть значение, сгенерированное СУБД. [у меня нет Delphi под рукой] - person TLama; 22.03.2015
comment
Я попробовал вашу таблицу в SQLite с FireDAC и DBGrid. Поле метки времени отображается нормально. Я использовал DBGrid вместо DBAdvGrid, потому что не мог вставлять записи при использовании DBAdvGrid. - person crefird; 22.03.2015
comment
Когда я создал вашу таблицу и использовал SQLiteSpy для ее проверки, тип данных столбца метки времени отображался как дата и время. - person crefird; 22.03.2015
comment
Спасибо, но это не моя таблица :) То, что вы наблюдаете, можно объяснить тем, что поле становится TEXT с форматом YYYY-MM-DD HH:MM:SS (как описано here). Тем не менее, я бы предпочел определить столбец как DATETIME и заполнять его вручную при каждой вставке (нет необходимости в дополнительной повторной выборке). Но это дело вкуса, зависящего от фактического применения. - person TLama; 23.03.2015
comment
Я только что проверил реализацию TADParam, и она достаточно умна, чтобы вы могли получить доступ к полю типа dtDateTimeStamp как к ftDateTime (через доступ AsDateTime). Таким образом, даже определение столбца как TIMESTAMP, который сопоставляется с типом поля dtDateTimeStamp, не ограничивает вас в обработке его как реального поля даты и времени. - person TLama; 23.03.2015
comment
Что ж, мы согласны с тем, что это не проблема закрытия/открытия (что я и так делаю), и это работает для вас, ребята, и это здорово. Что сужает его до характера данных, которые я вставляю. В реальной жизни я не буду писать этот файл и позволю базе данных позаботиться об этом по умолчанию. Однако (и я обновлю вопрос, чтобы отразить это, как я должен был сделать изначально), я генерирую некоторые фиктивные данные для тестирования морских свиней, используя TDateTime и IncSecond(startTime, delay * i). - person Mawg says reinstate Monica; 23.03.2015
comment
Итак, по сути, я пишу TDateTime в это поле, затем закрываю/открываю источник данных, и отображаются все остальные поля новой строки, но не это. - person Mawg says reinstate Monica; 23.03.2015