Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / SQLite UniDAC и Int64 / 14 сообщений из 14, страница 1 из 1
18.10.2021, 12:29
    #40105133
segor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite UniDAC и Int64
Всем привет!
Пользую компоненты UNIDAC для доступа к БД SQLite.
Там таблица messages

Код: plsql
1.
2.
3.
4.
5.
6.
CREATE TABLE messages (
    id                      INTEGER PRIMARY KEY AUTOINCREMENT,
    status                   INTEGER,
    data                     TEXT,
    send_timestamp           INTEGER
);



send_timestamp содержит значение int64

При попытке чтения поля send_timestamp получаю неверное значение, похоже что просто int.
Код: pascal
1.
send_timestamp := querySQLITE.FieldByName('send_timestamp').asLargeInt



Подскажите, пжалста, как лечить?
...
Рейтинг: 0 / 0
18.10.2021, 12:33
    #40105134
segor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite UniDAC и Int64
удалил повтор
...
Рейтинг: 0 / 0
18.10.2021, 13:01
    #40105149
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite UniDAC и Int64
segor
Всем привет!
Пользую компоненты UNIDAC для доступа к БД SQLite.
Там таблица messages

Код: plsql
1.
2.
3.
4.
5.
6.
CREATE TABLE messages (
    id                      INTEGER PRIMARY KEY AUTOINCREMENT,
    status                   INTEGER,
    data                     TEXT,
    send_timestamp           INTEGER
);



send_timestamp содержит значение int64

При попытке чтения поля send_timestamp получаю неверное значение, похоже что просто int.
Код: pascal
1.
send_timestamp := querySQLITE.FieldByName('send_timestamp').asLargeInt



Подскажите, пжалста, как лечить?
...
Рейтинг: 0 / 0
18.10.2021, 13:12
    #40105153
segor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite UniDAC и Int64
ъъъъъ,
эммм... ну в SQLite оно объявляется как INTEGER
...
Рейтинг: 0 / 0
18.10.2021, 14:19
    #40105174
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite UniDAC и Int64
Скорее всего надо в таблице нормально объявить, тогда юнидак увидит, что это беззнаковое целое. В крайнем случае у юнидака есть настройки типа Data Mapping, и там вручную можно указать, у какой колонки какой тип данных должен быть использован.
...
Рейтинг: 0 / 0
18.10.2021, 15:21
    #40105196
devart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite UniDAC и Int64
Для того, чтобы поле "send_timestamp" было представлено типом LargeInt Вы можете применить один из 3-х способов :

1) использовать опцию соединения IntegerAsLargeInt : https://www.devart.com/unidac/docs/using-sqlite.htm
2) использовать DataTypeMapping, например
Код: pascal
1.
2.
3.
4.
         ...
         UniQuery.DataTypeMap.AddFieldNameRule('send_timestamp', ftLargeint);
         UniQuery.Open;
         ...


3) объявить поле "send_timestamp" в таблице "messages" как BIGINT
...
Рейтинг: 0 / 0
18.10.2021, 16:20
    #40105220
segor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite UniDAC и Int64
JayDi,

К сожалению, в БД ничего менять нельзя. Нужно как-то решать на клиенте.
...
Рейтинг: 0 / 0
18.10.2021, 16:22
    #40105222
segor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite UniDAC и Int64
devart,

Пробовал через редактор свойств компонента query прописать 2 правила data type mapping. Общее и для конкретного поля. Не помогло.
...
Рейтинг: 0 / 0
18.10.2021, 16:36
    #40105231
segor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite UniDAC и Int64
скрины значений поля из базы и из дебаггера:
...
Рейтинг: 0 / 0
18.10.2021, 16:50
    #40105238
segor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite UniDAC и Int64
devart
Для того, чтобы поле "send_timestamp" было представлено типом LargeInt Вы можете применить один из 3-х способов :

1) использовать опцию соединения IntegerAsLargeInt : https://www.devart.com/unidac/docs/using-sqlite.htm
2) использовать DataTypeMapping, например
Код: pascal
1.
2.
3.
4.
         ...
         UniQuery.DataTypeMap.AddFieldNameRule('send_timestamp', ftLargeint);
         UniQuery.Open;
         ...


3) объявить поле "send_timestamp" в таблице "messages" как BIGINT


по п.1 такую опцию не нашел у TUNIConnection.
...
Рейтинг: 0 / 0
18.10.2021, 17:18
    #40105249
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite UniDAC и Int64
segor,

после настройки дата меппинга надо пересоздать поля в датасете (если они были созданы до этого).
...
Рейтинг: 0 / 0
18.10.2021, 17:52
    #40105258
devart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite UniDAC и Int64
Опция соединения IntegerAsLargeInt была добавлена в последней версии UniDAC 9.0.1. Таким образом, если изменять тип поля в БД нельзя и Вы используете одну из устаревших версий UniDAC,
единственным способом решения является использование DataTypeMapping
...
Рейтинг: 0 / 0
19.10.2021, 10:19
    #40105343
segor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite UniDAC и Int64
segor
devart,

Пробовал через редактор свойств компонента query прописать 2 правила data type mapping. Общее и для конкретного поля. Не помогло.


ну вот такой способ у меня не работает. Или я что-то не так указал?
...
Рейтинг: 0 / 0
19.10.2021, 19:11
    #40105466
devart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLite UniDAC и Int64
Следующий фрагмент кода демонстрирует применение правила DataTypeMapping для поля 'send_timestamp' :
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
...
var
  UniQuery: TUniQuery;
  Value: Int64;
begin
  ...
  UniConnection.ExecSQL('Insert Into messages (status, data, send_timestamp) Values (1, ''String Data'', 1634114415000)');
  UniQuery := TUniQuery.Create(nil);
  try
    UniQuery.Connection := UniConnection;
    UniQuery.SQL.Text := 'Select * From messages';
    UniQuery.DataTypeMap.AddFieldNameRule('send_timestamp', ftLargeint);
    UniQuery.Open;
    Value := UniQuery.FieldByName('send_timestamp').AsLargeInt;
  finally
    UniQuery.Free;
  end;
  ...
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / SQLite UniDAC и Int64 / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]