powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / прочитать значение поле INTEGER как float
16 сообщений из 16, страница 1 из 1
прочитать значение поле INTEGER как float
    #39805862
Belotsky Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Нужно прочитать вещественное значение поля объявленное как INTEGER в одной таблице БД.
И у меня что-то не выходит (читается только как целое).
Для проверки сделал свой код.

Для работы с SQLite используется TSQLConnection (dbExpress).

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
               
var
 dsData :TDataSet;
 fV :double;
 ...
 Params.CreateParam(TFieldType.ftInteger,'Field1',ptInput);
 Params.ParamByName('Field1').AsFloat := 11.3;  // запись выполняется корректно, как 11.3
 ...
 SQLConnection1.Execute(cInsertQuery,Params); // вставить запись с параметрами
...
// чтение вставленной записи
 fV := dsData.FieldByName('Field1').AsFloat; // fV = 11 (целое)



При этом SQLite Expert показывает корректное вещественное значение (см. скриншот), но выполняет нестандартное фоновое выделение.

Пробовал разные AsXXX (AsString, AsVariant, AsSingle) - всегда возвращается целое значение.

БД не моя, мне нужно прочитать корректное вещественное значение. Как это можно сделать?
...
Рейтинг: 0 / 0
прочитать значение поле INTEGER как float
    #39805961
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belotsky Serge,

какой DBExpress драйвер для SQLite используете, DDL таблицы?

Params.CreateParam(TFieldType.ftInteger,'Field1',ptInput);
TFieldType.ftInteger ???
...
Рейтинг: 0 / 0
прочитать значение поле INTEGER как float
    #39805983
Belotsky Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pit_alexBelotsky Serge,

какой DBExpress драйвер для SQLite используете, DDL таблицы?

Params.CreateParam(TFieldType.ftInteger,'Field1',ptInput);
TFieldType.ftInteger ???

Честно говоря, не знаю где она берет этот драйвер (Delphi XE3). Делал я на примерах этого ресурса:
https://www.webdelphi.ru/2012/10/sqlite-v-delphi-xe3/
https://www.webdelphi.ru/2013/01/sqlite-v-delphi-xe3-2/

Настраиваю я соединение примерно так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
object SQLConnection1: TSQLConnection
    ConnectionName = 'SQLITECONNECTION'
    DriverName = 'Sqlite'
    LoginPrompt = False
    Params.Strings = (
      'DriverName=Sqlite'
      'Database='
      'UserName=SYSDBA'
      'Password=masterkey'
      'TableName=')
    Left = 400
    Top = 80
  end




Поле объявлено вот так:
Код: sql
1.
CREATE TABLE tbMain(..., Field1 INTEGER ...);



Да, я обратил внимание, что параметр объявлен как TFieldType.ftInteger . Но опять же, мне нужно было полностью сымитировать занесение данных как оригинальной таблице БД. (БД не моя).

Я проделал это с ftFloat, данные записались в таблицу точно также.
...
Рейтинг: 0 / 0
прочитать значение поле INTEGER как float
    #39805993
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belotsky Serge,

Тип поля какой?
...
Рейтинг: 0 / 0
прочитать значение поле INTEGER как float
    #39806002
Belotsky Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pit_alexBelotsky Serge,

Тип поля какой?

Не понимаю вопрос, вроде INTEGER. См. скриншот.
В поле типа INTEGER занесено значение 11.3. Вопрос: как его прочитать как '11.3', а не как '11'.
...
Рейтинг: 0 / 0
прочитать значение поле INTEGER как float
    #39806009
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО вопрос не по SQLite, а по Дельфи, из которого чтение идет. Советую спросить в форуме по Делфи
...
Рейтинг: 0 / 0
прочитать значение поле INTEGER как float
    #39806013
Belotsky Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Удалось прочитать при помощи вот этого wrapper (Plashenkov):
https://github.com/plashenkov/SQLite3-Delphi-FPC

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
procedure TForm1.FormShow(Sender: TObject);
var
 DB: TSQLite3Database;
 Stmt: TSQLite3Statement;
 DoCreate :boolean;
 fV :double;
 iV :integer;
 S :string;
// IdRec :integer;
begin
 DB := TSQLite3Database.Create;
 try
  DoCreate := not FileExists(ExtractFilePath(Application.ExeName)+'test_int.db');

  DB.Open('test_int.db');

  if DoCreate then
   begin
    DB.Execute('CREATE TABLE test_int (intField INTEGER)');
    // Fill the table with the value
    Stmt := DB.Prepare('INSERT INTO test_int (intField) VALUES (?)');
    try
     Stmt.BindDouble(1, 11.3);
     Stmt.StepAndReset;
//    IdRec := DB.LastInsertRowID;
    finally
     Stmt.Free;
    end;
   end;

  Stmt := DB.Prepare('SELECT intField FROM test_int');
  try
   if(Stmt.Step = SQLITE_ROW)then
    begin
     iV := Stmt.ColumnCount;         // iV = 1
     fV := Stmt.ColumnDouble(0);     // fV = 11.3
     iV := Stmt.ColumnInt(0);        // iV = 11
     S := Stmt.ColumnText(0);        // S = '11.3'
     Label1.Caption := FloatToStr(fV);
    end;
  finally
   Stmt.Free;
  end;
 finally
  FreeAndNil(DB);
 end;
end;


Данный враппер базируется на sqlite3.dll.
Вопрос: а при помощи чистого dbExpress (без подключения dll) - это можно сделать?
...
Рейтинг: 0 / 0
прочитать значение поле INTEGER как float
    #39806046
Belotsky Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Belotsky Serge,

PS: Дальнейшие эксперименты, показали, что через dbExpress также нормально читаются вещественные значения из полей типа INTEGER, но только для таблиц, которые я сам создал и заполнил. Оригинальные же таблицы корректно можно прочитать только через враппер (т.е. через sqlite3.dll). Через dbExpress почему-то упорно возвращаются целочисленные значения.

В чем разница между этими БД понять не могу, для меня они практически одинаковые.
...
Рейтинг: 0 / 0
прочитать значение поле INTEGER как float
    #39806054
pit_alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belotsky Serge,

в sqlite можно создавать колонки с ЛЮБЫМИ типами данных, т.е.

Код: sql
1.
CREATE TABLE TEST(FIELD1 MY_NAME ..



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

SLite3.dll это движок самого SQLite и стандартный dbExpress драйвер то же работает через эту либу.

Либо создавайте поле FLOAT и будет вам счастье
...
Рейтинг: 0 / 0
прочитать значение поле INTEGER как float
    #39806064
Belotsky Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pit_alexBelotsky Serge,

SLite3.dll это движок самого SQLite и стандартный dbExpress драйвер то же работает через эту либу. ???

Либо создавайте поле FLOAT и будет вам счастье

Еще раз: оригинальная БД - чужая , я не могу задать FLOAT! Она ко мне поступает готовая. Я только хочу ее прочитать корректно. Если я сделаю аналог этой БД и/или таблицы таблицы (неважно как: через dbExpress или через SQLite3.dll), то у меня корректно получается ее прочитать (любым способом: через dbExpress или SQLite3.dll). А вот прочитать оригинальную БД корректно у меня получается только через SQLite.dll, dbExpress здесь почему-то не работает :(
...
Рейтинг: 0 / 0
прочитать значение поле INTEGER как float
    #39806392
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belotsky SergeВ поле типа INTEGER занесено значение 11.3. Вопрос: как его прочитать как '11.3', а не как '11'.
Может я сильно тупой, но КАК в поле integer может быть значение 11.3 ?
...
Рейтинг: 0 / 0
прочитать значение поле INTEGER как float
    #39806395
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevBelotsky SergeВ поле типа INTEGER занесено значение 11.3. Вопрос: как его прочитать как '11.3', а не как '11'.
Может я сильно тупой, но КАК в поле integer может быть значение 11.3 ?
В SQLite нетипизированные поля.
https://www.sqlite.org/datatype3.html SQLite uses a more general dynamic type system. In SQLite, the datatype of a value is associated with the value itself, not with its container. The dynamic type system of SQLite is backwards compatible with the more common static type systems of other database engines in the sense that SQL statements that work on statically typed databases should work the same way in SQLite. However, the dynamic typing in SQLite allows it to do things which are not possible in traditional rigidly typed databases.
...
Рейтинг: 0 / 0
прочитать значение поле INTEGER как float
    #39806405
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO
Подозреваю, тогда так же, как и в других СУБД. Привести в SELECT поле к нужному/правильному типу (float) и не изврашаться. Беглый поиск по доке говорит, что конструкция CAST в SQLLite присутствует.

https://www.sqlite.org/lang_expr.html

Не проверял.
...
Рейтинг: 0 / 0
прочитать значение поле INTEGER как float
    #39806425
Belotsky Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid KudryavtsevBelotsky SergeВ поле типа INTEGER занесено значение 11.3. Вопрос: как его прочитать как '11.3', а не как '11'.
Может я сильно тупой, но КАК в поле integer может быть значение 11.3 ?

Вот HEX представление значения этого поля. Можете проверить, это double = 11.3.
...
Рейтинг: 0 / 0
прочитать значение поле INTEGER как float
    #39806428
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO Если сделать CAST в float (в SELECT), то думаю Delphi должен нормально прочитать.
...
Рейтинг: 0 / 0
прочитать значение поле INTEGER как float
    #39806440
Belotsky Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid KudryavtsevIMHO
Подозреваю, тогда так же, как и в других СУБД. Привести в SELECT поле к нужному/правильному типу (float) и не изврашаться. Беглый поиск по доке говорит, что конструкция CAST в SQLLite присутствует.

https://www.sqlite.org/lang_expr.html

Не проверял.

Да, так можно получить корректное значение. Завтра еще раз перепроверю.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    Execute('SELECT CAST(intField as FLOAT) FROM test_int', nil, dsData); // DataK

    while not dsData.Eof do
     begin
//      fV := dsData.FieldByName(dsData.FieldDefs[0].Name).AsFloat; // Ошибка 'Cannot access field 'Column0' as Float
      V := dsData.FieldByName(dsData.FieldDefs[0].Name).Value; // так работает
      S := VarToStr(V);
      ListBox1.Items.Add(Format('%s',[S]));

      dsData.Next;
     end;

...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / прочитать значение поле INTEGER как float
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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