Clientdataset delphi описание компонента

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

Таблица 29.1. Важные свойства компонента ClientDataSet

Содержит количество изменений в буфере. После явного сохранения изменений в базу данных, это свойство содержит 0.

Содержит текст SQL-запроса, который может быть выполнен методом Execute компонента. Таким образом, можно изменять НД, предоставляемый сервером.

Свойство содержит пакет данных, предназначенный для передачи по сети в специальном транспортном формате.

Размер в байтах пакета Data.

При отношении один-ко-многим, свойство у подчиненного ClientDataSet позволяет выбрать специальное поле типа TDataSetField, которое инкапсулирует данные подчиненного НД. Подробней об этом поговорим ниже.

Пакет с измененными данными, которые еще не сохранены на сервере.

При значении True (по умолчанию) разрешает компоненту получать очередной пакет данных по мере надобности, например при прокрутке сетки DBGrid.

Может содержать имя файла, в которое при необходимости будет сохранять данные, или считывать их. Если этого имени нет, можно использовать SaveDialog или OpenDialog для получения этого имени от пользователя.

Указывает количество записей, получаемых из серверного НД в одном

пакете. По умолчанию равно -1, то есть считываются все записи. Если значение равно 0, то считываются только метаданные.

Имя компонента-провайдера на стороне сервера (Ба1а8е1Ргоу1с1ег), который предоставляет доступ к нужному набору данных.

Имя компонента соединения (например, ОСОМСоппейюп), с помощью которого компонент подключается к удаленному модулю данных. Это свойство нужно настраивать в первую очередь.

Теперь рассмотрим основные методы компонента ClientDataSet. Таблица 29.2. Важные методы компонента ClientDataSet

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

ApplyRange Включает механизм фильтрации по созданному ранее диапазону.

Обновляет записи в базе данных. Имеет параметр — максимальное количество ошибок (по умолчанию 0), после которых обновление прекращается. Возвращает целое число — количество действительно допущенных ошибок.

Отменяет все неподтвержденные изменения записи.

Отменяет механизм фильтрации по указанному диапазону.

Отменяет все неподтвержденные изменения из пакета Delta, предназначенные для дальнейшей передачи на сервер.

Удаляет локальный индекс.

Очищает буфер от всех записей.

Выполняет SQL-запрос из свойства CommandText, меняя НД на стороне сервера.

По умолчанию, большие BLOB-столбцы, которые могут содержать изображение, музыку или какие либо двоичные данные, в целях разгрузки трафика клиенту не передаются. Метод FetchBlobs явно запрашивает с сервера содержимое текущего BLOB-столбца.

Запрашивает с сервера недостающие данные из вложенных или подчиненных таблиц. Если свойство FetchOnDemand имеет значение True, то эти данные подгружаются автоматически, и применять метод не нужно.

Получает с сервера приложений текущие параметры набора данных провайдера. Если параметров нет, метод не делает ничего.

Запрашивает с сервера очередной пакет записей, который будет добавлен к свойству Data. Длина пакета в записях определяется свойством PacketRecords.

Читайте также:  Как в зте поставить музыку на контакт

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

Загружает данные из потока.

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

Обновляет текущую запись, запрашивая ее с сервера.

Восстанавливает текущую запись, если она была изменена, но еще не сохранена на сервере.

Сохраняет данные в локальный файл. Отличается от аналогичного метода других компонентов наличием второго параметра — формата

данных файла. Может быть три формата: dfßinary — двоичный формат, dfXML — формат XML и dfXMLUTF8 — формат XML в кодировке UTF8.

Всем привет дорогие друзья! Продолжаем нашу тему, в которой мы рассматриваем работу с файловыми базами данных в Delphi. Мы продвигаемся постепенно, в первой статье рассмотрели общую структуру, во второй статье мы рассмотрели, как можно сохранять и открывать наш набор данных (только он у нас был пустой).

Сегодняшняя статья посвящена наполнению данного набора. То есть, мы начнем рассматривать, как можно добавлять записи в нашу файловую базу данных, удалять их, редактировать, а также осуществлять простейший поиск. Тут в принципе ничего сложного нет, а самое главное, что Вы в этом сейчас сами убедитесь.

Для начала не забудьте прочитать предыдущие статьи (это для тех, кто пропустил данную тему раньше, а только присоединился сейчас):

Ну что, часть пользователей мы уже подготовили, давайте приступать к рассмотрению данной темы. Скажу честно, что производить какие-то операции с файловым набором данных (редактирование, удаление, поиск, добавление), имеет такой же смысл, как и работа с другим набором данных (с другой базой), например ADO.

Ну что, давайте создадим проект в Delphi, разместим на форме следующие компоненты:

  • TClientDataSet
  • TDBGrid
  • TButton
  • TDataSource
  • TOpenDialog
  • TSaveDialog

В общем, проект у меня выглядит следующим образом:

Количество кнопок у Вас может быть разное. Установите так, чтобы мы могли сделать поиск, редактировать, удаление и добавление. А там по вашему усмотрению. Тут я не буду рассказывать, как компонент связывать между собой, а также как сохранять набор данных в файл и открывать его.

Начнем мы с добавления записи. Когда мы работали с ADO, то мы использовали процедуру Insert. Тут тоже самое, для добавления нам необходимо использовать данную процедуру, затем задать значения нашим полям и сохранить набор данных. В общем, добавление записи будет выглядеть следующим образом:

Так как, я в первой статье создавал набор данных про телефоны, то я задал поле ID (тип — autoinc), которое автоматически увеличивается. Поэтому, я начинаю только со второго поля. Если Вы знаете конкретный тип поля, то можете его задавать напрямую. В конце нам необходимо сохранить набор данных, можно это сделать не только в файл, а в память, например.

Читайте также:  3 Долгих гудка биос

Для редактирования данных, мы будем использовать процедуру Edit, а код будет следующим:

То есть, смысл тот же самый. Нам для начала необходимо выделить запись в компоненте TDBGrid, которую хотим редактировать, затем переводим набор данных в редактирование, задаем новые значения и сохраняем его. Кстати, Вы можете задавать не номера полей, а их название, это будет выглядеть следующим образом:

С удалением все тоже самое, используем процедуру Delete. Это будет выглядеть следующим образом:

Для поиска можно использовать фильтры, либо же использовать функцию Locate:

Вы также можете перемещаться по набору данных, используя процедуры:

Вот и все! Теперь Вы знаете как быстро и просто использовать файловые базы данных в Delphi. Но цикл статей еще не заканчивается, так как дальше мы будем рассматривать структуру файлов для БД, а также работу с индексами. Проект прикладываю и Вы его можете скачать тут.

По данным этой странице можно использовать TClientDataset как набор данных в памяти, полностью независимый от любых фактических баз данных или файлов. В нем описывается настройка структуры таблицы набора данных и загрузка данных в нее во время выполнения. Но когда я попытался следовать его инструкциям в D2009, Шаг 4 ( table.Open ) вызвало исключение. Он сказал,что у него нет указанного поставщика.

весь смысл примера на этой странице заключается в создании набора данных, который не нужен провайдер. Страница неправильная, она устарела, или я где-то пропустил шаг? И если страница неверна, что мне нужно использовать вместо этого для создания полностью независимого набора данных в памяти? Я использовал TJvMemoryData , но если возможно, я хотел бы уменьшить количество дополнительных зависимостей, которые мой набор данных добавляет в мой проект.

11 ответов

во время выполнения вы можете использовать table.CreateDataset или если это в области конструктора, щелкните правой кнопкой мыши компакт-диски и выберите Создать набор данных. Однако для этого необходимо указать столбцы/типы для компакт-дисков.

Если это поможет дальше, вот фрагмент кода, где я создал ClientDataset, который используется в качестве таблицы в памяти:

вы можете просто подставить свои данные и вперед. Джек!—2—>

Не забудьте включить MIDAS.DLL в вашей установке или просто включить MidasLib в uses предложение. В противном случае, используя TClientDataSet вызовет ошибку на машине клиента. Может быть, это очевидно, но я действительно забыл об этом.

можно использовать table.CreateDataSet

код с этой страницы не работает ни в одной версии Delphi. Вызов CreateDataSet уже переводит набор данных в активное состояние ("открыт"). Вы должны использовать .CreateDataSet или .Открыть. Не оба.

использовать .Откройте, если вы хотите получить данные от поставщика (через свойство ProviderName) и .CreateDataSet, когда вы хотите заполнить набор данных самостоятельно.

Читайте также:  Почему ноутбук не подключается к вайфаю телефона

BTW: для углубленной справки о ClientDataSets и его функциях взгляните на excellent Кэри Дженсен статьи о CodeGear Developer Network (сначала прочитайте самые старые)

Если вы хотите без зависимостей, высокое качество и многофункциональность (не говоря уже о бесплатной!) набор данных в памяти, я настоятельно рекомендую kbmMemTable. Делает все TClientDataset и затем некоторые.

кладбищенские камни ниже для некоторых компонентов libre

во времена Delphi 5 / Delphi 7 были инициативы, чтобы сделать любой объект с опубликованными свойствами (точнее — массив или некоторая коллекция из них) в базу данных. На Torry.net это CollectionDataSet и набор данных объектов Лет до LINQ и такие. Но поскольку код DB-VCL мало документирован и является спагетти с 16-битных Delphi 1.0 — у них нет разработки.

там тоже набор данных объектов привязки на основе обратного вызова (событий), не настолько устаревший. Хотя это оставляет слишком много IMHO на плечах разработчиков.

TDBF.sf.net таблица имела режим In-memory, но была рано удалена. TDBF тоже мертв.

rxLib / JediVCL имеет MemoryDataset. Хотя цель rxLib был источник-уровень совместимости с 16-бит на Delphi 1 до Delphi 5.в Это сильно нарушило кодекс. В JVCL у него было некоторое внимание и удаление кода старения, но все еще наполовину испечено, когда нужно немного глубже чем тривиальное использование.

есть также бесплатные для личных компонентов DCU, таких как SQLMemoryTable, но не для последних выпусков. Интересно, Можно ли использовать Firebird Embedded / SQLite для создания таблицы в памяти без использования общесистемных хаков, таких как RAMdrive: -)

по какой-то причине это не работает для меня. Я исполняю CreateDataset во время разработки, но он по-прежнему сбой приложения. Это мне до сих пор неизвестно. Одно предупреждение. НЕ ДЕЛАЙТЕ ЭТОГО:

потому что он сообщит об ошибке. Вместо Open используйте

в моем приложении мне нужно было сбросить данные и загрузить их снова, и это снова вызвало сообщение об ошибке.

Я предпочитаю фактически управлять набором данных как XML. С помощью средств конструктора можно создать базовую структуру, а затем сохранить ее на диск. Это позволяет управлять им за пределами исполняемого файла, скомпилированного в качестве ресурса или отдельно управляемого в системе управления версиями.

при этом вы можете использовать LoadFromFile / Stream и варианты сохранения. Не забудьте правильно использовать LogChanges и MergeChangeLog в зависимости от вашего использования.

для меня это было вызвано Мидас.несоответствие dll. Я исправил это, добавив MidasLib в предложение main programs uses (таким образом, связывая библиотеку статически). Больше информации здесь: http://codeverge.com/embarcadero.datasnap/tclientdataset-createdataset-failing-wit/1097715 и тут:http://edn.embarcadero.com/article/29297

это исправленный рабочий код, упомянутый OP в первом посте. Вы получаете таблицу памяти от TClientDataset показано в DBGrid.