powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC + SQLite + Spatialite. Select поля geom возвращает WideString вместо BLOB
3 сообщений из 3, страница 1 из 1
FireDAC + SQLite + Spatialite. Select поля geom возвращает WideString вместо BLOB
    #40061709
Фотография _avz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для работы с локальными картами используется связка: FireDAC + SQLite + Spatialite (расширение SQLite)
Есть таблица с полем geom типа GEOMETRY, добавленным функцией Spatialite AddGeometryColumn()
Геометрия возвращается с помощью функции Spatialite AsBinary(geom) - выдаёт BLOB
В общем, всё работает.
Но на пространственных запросах с некоторыми координатами
вместо BLOB выдаётся WideString длиной 2 и с содержимым
#1#2 (SOH STH)
Остальные поля запроса в порядке.

Явное приведение к блобу select (cast(asbinary(geom) as blob)) не помогает.
если вместо asbinary() использовать ST_AsBinary() - почему-то помогает, хотя из доки непонятно, в чём между ними разница.
Но не во всех случаях.
Чаще всего на запросах, которые возвращают 0 строк, и столбец генерируется такой: FDQuery.Fields[..].DataType = ftWideString
И ещё, такая закономерность: если запрос вот так заглючит, а затем ему передать параметры (границы карты), где данные есть,
он продолжает выдавать WideString вместо BLOB

Я понимаю, вопросы здесь к расширению Spatialite, но всё равно неясно:

1. Почему FireDAC меняет тип столбца после Open (видимо, пытаясь автоопределить по содержимому #1#2)
2. Какие есть предположения, почему ST_AsBinary может выдавать #1#2 и что это за признак
3. Возможно ли, что это глюк FireDAC, а не Spatialite?

Если что, запрос пространственный такой:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select id,vt,layer_id,objtype_id,cast(st_asbinary(geom) as blob)geom 
from vobj v
where
v.ROWID IN (
    SELECT ROWID 
    FROM SpatialIndex
    WHERE f_table_name = 'vobj' 
        and search_frame = :wnd)
and
st_intersects(geom, :wnd) --and not within(:wnd, geom)




RAD Studio 10.1
...
Рейтинг: 0 / 0
FireDAC + SQLite + Spatialite. Select поля geom возвращает WideString вместо BLOB
    #40061745
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
FireDAC + SQLite + Spatialite. Select поля geom возвращает WideString вместо BLOB
    #40061760
Фотография _avz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Arefiev,

И снова СПАСИБО!

документацияFor an expression in a SELECT list, SQLite avoids type name information. When the result set is not empty, FireDAC uses the value data types from the first record. When empty, FireDAC describes those columns as dtWideString. To explicitly specify the column data type, append ::<type name> to the column alias:

SELECT count(*) as "cnt::INT" FROM mytab


Поменял cast(st_asbinary(geom) as blob) на st_asbinary(geom) as "geom::blob", и не вижу повторения эффекта!
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FireDAC + SQLite + Spatialite. Select поля geom возвращает WideString вместо BLOB
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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