Проблема привязки данных (наборы данных отображают неправильные типы полей)

В основном я следовал этому примеру: http://www.youtube.com/watch?v=B4uxLLIUddg

Создать -> Другое -> Сервер Datasnap -> Приложение VCL Forms (все настройки по умолчанию, порт 211 работает, TDSServerModule).

Затем создал таблицу в SQLite:

CREATE TABLE [T1] (
  [ID] INTEGER PRIMARY KEY AUTOINCREMENT, 
  [DATE] DATE, 
  [TIME] TIME);

На моем ServerMethodsUnit1 я удалил TSQLConnection. Изменил драйвер на Sqlite. Удален запрос входа в систему. Соединение установлено нормально. Добавил TSQLDataset и подключил его к моему SQLITECONNECTION. Установите CommandText на мой T1 (имя таблицы). Активировал без проблем. Добавил datasetprovider1 и выровнял его с моим набором данных (таблица T1). Сохранил все. Запустите сервер без проблем. При работающем сервере я построил клиентскую часть:

В свой проект я добавил новый проект (приложение форм vcl). Добавлен компонент SQLConnection. Установите имя драйвера на Datasnap. Удален запрос на вход. На форму я сбросил DSProviderConnection1. Подключил его к моему sqlconnection. Задайте для его ServerClassname значение TServerMethods1. Проверил соединение - оба работают нормально. Отброшен клиентский набор данных. Подключил свое свойство RemoteServer к свойству DSProviderConnection1. ProviderName в DataSetProvider1. Подключение успешно. Набор клиентских данных активен. Добавил DataSource. Связал его с моим Clientdataset. Все соединения работают. Поэтому я добавил немного графического интерфейса. Удалены TDBGrid и TDBNavigator. Связал их с Datasource1. Первая странность, которую я заметил, это то, что во всех полях отображается Widememo. Почему так, когда поля совершенно разные, я не знаю. Зашел в редактор полей,добавил поля и при проверке BlobType все отображал ftWideMemo.

введите здесь описание изображения

Я попытался вставить сегодняшнюю дату прямо в сетку, и каким-то образом в моей БД она оказалась: 1899-12-30. Проверяя таблицу (T! на стороне сервера), поля DATE и TIME также отображают widememo.

Что мне здесь не хватает?


person user763539    schedule 19.03.2014    source источник


Ответы (3)


SQlite имеет очень свободную типизацию. DATE и TIME не являются частью SQLite. А DBGrids не знает, что делать с SQLite TEXT.

Я решил эту проблему, используя VARCHAR(length) вместо TEXT при определении полей. Затем они будут отображать OK в DBGrid. И я делал даты также как VARCHAR().

Смотрите также

Отображение и редактирование полей MEMO в TDBGrid Delphi http://delphi.about.com/library/weekly/aa030105a.htm

person mthand    schedule 20.03.2014

В SQlite3 нет родного типа DATE и TIME:

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

  • ТЕКСТ в виде строк ISO8601 ("ГГГГ-ММ-ДД ЧЧ:ММ:СС.ССС").
  • РЕАЛЬНОЕ число дней по юлианскому календарю, количество дней, прошедших с полудня по Гринвичу 24 ноября 4714 г. до н.э. по пролептическому григорианскому календарю.
  • INTEGER как время Unix, количество секунд, прошедших с 1970-01-01 00:00:00 UTC.

Приложения могут хранить дату и время в любом из этих форматов и свободно конвертировать между форматами, используя встроенные функции даты и времени.

Также убедитесь, что вы понимаете функцию «сходства типов» столбцов SQlite3, которая является довольно мощной, но может сбивать с толку, если вы исходите из «строго типизированной» СУБД.

Что вы можете сделать, это

  • Либо используется время Unix и столбец INTEGER — см., например, функцию UnixToDateTime в модуле DateUtils.pas;
  • Или столбец TEXT и кодировка ISO-8601 (я предпочитаю).

Затем вам нужно будет отобразить это значение в DataSnap — я знаю, что наши модули mORMot это позволяют, и я не знаю точно для DataSnap.

Также взгляните на все интегрированные функции даты/времени в SQlite3, которые довольно полны.

person Arnaud Bouchez    schedule 20.03.2014

У меня была та же проблема, что и все мои поля SQLite отображались как поля WideMemo в DBGrid.

Одним из простых решений является заполнение соответствующей таблицы sqlite хотя бы одной (1) строкой «правильных» данных (без пустых полей). Когда компоненты VCL подключаются (в первый раз), они, кажется, могут создавать поля с правильным типом. То есть, если вы щелкните правой кнопкой мыши компонент TSQLDataSet и выберите Редактор полей -> Создать поля с таблицей, которая имеет хотя бы одну строку данных, поля будут сопоставлены правильно.

Я не проверял, работает ли это для типа DATE, но работает для целых чисел, двойных чисел и текста.

По какой-то причине, если таблица пуста, все поля создаются как большие двоичные объекты WideMemo.

person Totte Karlsson    schedule 03.12.2014