#database #delphi #ado #delphi-2007
#База данных #delphi #ado #delphi-2007
Вопрос:
Я работаю с приложением, которое переключается с хранилища данных на основе файлов на основе базы данных. Он содержит очень большой объем кода, который написан специально для файловой системы. Чтобы переключиться, я внедряю функциональность, которая будет работать как старая система, затем планируется более оптимальное использование базы данных в новом коде.
Одна из проблем заключается в том, что файловая система часто считывала отдельные записи и повторно считывала их для отчетов. Это привело к большому количеству запросов к базе данных, что является медленным.
Идея, которую я пытался воплотить в жизнь, заключается в использовании двух наборов данных. Один набор данных для извлечения всей таблицы, а другой набор данных для запроса к первому, тем самым уменьшая затраты на связь с сервером базы данных.
Я попытался посмотреть на DataSource
свойство TADODataSet
, но для набора данных по-прежнему требуется подключение, и он напрямую запрашивает базу данных, Connection
назначена ли она.
Причина, по которой я предпочел бы получить результат в другом наборе данных, а не перемещаться по первому, заключается в том, что там уже реализовано достаточное количество логики для эмуляции старой системы. Эта логика основана на наличии набора данных, содержащего только результаты, запрошенные со старым интерфейсом.
Функциональность должна поддерживать только чтение данных, а не их обратную запись.
Как я могу использовать один набор данных для предоставления значений для другого набора данных для выбора?
Я использую Delphi 2007 и MSSQL.
Комментарии:
1. Назначение свойства DataSource TADODataSet — разрешить элементам управления, учитывающим данные, подключаться к TDataSet, не зная, какой потомок TDataSet используется. Для связывания набора данных вы должны использовать свойства MasterSource и MasterFields. Но даже при соотношении 1-1 между основным и подробным данными это не позволит вам использовать «выбрать из TDataSet1» в качестве выбора для вашего другого набора данных.
2. @Marjan Я думал, что свойство DataSource TADODataSet должно было позволить TADODataSet быть этим компонентом, поддерживающим данные. Ссылка VCL гласит: «Представляет источник данных другого набора данных, который предоставляет значения для набора данных».
3. вы правы. Я ответил исключительно на основе «источника данных» в качестве имени. Источник данных элемента управления с поддержкой данных — это то, что соединяет его с его набором данных. Но источник данных набора данных — это действительно совершенно другой зверь. Я посмотрел на TClientDataSet и, по-видимому, это единственный набор данных с основным источником. У других потомков TDataSet действительно есть DataSource, и, похоже, это и есть MasterSource для TClientDataSet, поскольку TADODataSet / TSQLDataSet не имеют MasterSource, но имеют свойство MasterFields.
Ответ №1:
Вы можете использовать пару ClientDataSet / DataSetProvider для извлечения данных из существующего набора данных. Вы можете использовать фильтры для исходного набора данных, фильтры для набора данных клиента и события поставщика, чтобы обрезать набор данных только до интересных записей.
Я с успехом использовал этот метод в паре проектов миграции и для смягчения аналогичной ситуации, когда к старой базе данных SQL Server 7 тысячи раз обращались с запросами для извлечения отдельных записей с болезненными затратами на производительность. Запрос к нему только один раз, а затем извлечение отдельных записей в клиентский набор данных было в то время не только элегантным решением, но и значительным повышением производительности для этого конкретного приложения: самым замечательным примером был 8-часовой процесс, сокращенный до 15 минут… бедные пользователи любили меня в то время.
Набор ClientDataSet — это просто набор TDataSet, который вы можете легко интегрировать в существующий код и пользовательский интерфейс.