Как да напиша DataSet

В последната статия се запознахме с архитектурата TDataSet и написахме потомък от нея под формата на електронна таблица. Сега задачата е да свържем нашия TDataSet към базата данни. Нека разгледаме това на примера на компоненти за достъп InterBase SQL Server и FIBPlus от Devrice: http://www.fibplus.com.ua/rus/index.shtml. Изборът на тази конкретна библиотека за достъп не е случаен. Факт е, че InterBase и клонингите на Borland: Yaffil и FireBird, очевидно в близко бъдеще ще се разминават в архитектурата, може би API, но има увереност, че Devrice ще поддържа всички сървъри, но не и за IBX. Освен това цената на тези компоненти е приемлива за руски разработчик. FIBPlus е по-ефективна и удобна библиотека за достъп. Можете да използвате неговите компоненти заедно с тези, които сега ще разгледаме. Освен това никой не ви пречи да наследявате за друга библиотека. Например като бонус ще намерите компоненти за достъп чрез ADO интерфейси в изходния код, придружаващ тази статия. Това е полезно, например, за феновете на Delphi 3 и Delphi 4 или за онези, които са уморени от компонентите ADO в по-стари версии. Повтарям още веднъж, че текстовете са написани за Delphi 3. Нещо за пренасяне към по-стари версии, поне до Delphi 5, вече е направено, но не се ласкайте, че всичко е абсолютно.

Основни принципи.

Разгледайте внедряването на методите InternalPost и InternalDelete на класа TUnDataSet в модула UnCustomDataSet. pas. Тези методи имат извикване на FUpdater. FUpdater при потомци - това е извличането, наследено от TUnCustomUpdater. Тези. когато правим Post, проверяваме дали е имало вмъкване или е било редактиране (според състоянието на набора от данни) и изпълняваме съответно DoInsert или DoUpdate на извличащия. По същия начин, когато настъпи изтриване в метода InternalDelete на набора от данни, методът DoDelete на извличащия се изпълнява.

Методът TUnDataSet._CheckPositionCursor проверява дали всички редове са извлечени от базата данни. За това се извиква методът _CheckNextFech. За TUnDataSet този метод практически не прави нищо. Той ще бъде заменен при потомците. И тогава ще бъде извикан методът GetNextData, ако извличащият има EOF <> true, т.е. все още не са конфигурирани всички данни.