Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Сокровищница
  
 

Фильтр по датам

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  03:18[Войти] | [Зарегистрироваться]

TdkMySqlDataSet — DataSet для TMySql

Дмитрий Ларионов
дата публикации 15-08-2009 13:07

TdkMySqlDataSet — DataSet для TMySql

По многочисленным не многочисленным просьбам и в большей степени для себя написал наследника TDataSet, надстройку над TMySql.

TdkMySqlConnection = class(TComponent) — подключение к MySql

  • Параметры подключения:
    • property Port: Integer;
    • property Host: string;
    • property User: string;
    • property Password: string;
    • property Database: string;
  • function Connect: Boolean;
    Собственно процесс подключения.
  • procedure Disconnect;
    Отключение от MySql.
  • property Connected: Boolean;
    Проверка выполнено ли подключение к базе.
  • function ExecSQL(const SQL: String): Boolean;
    Функция, выполняющая запросы к базе, не предусматривающие возврат данных (UPDATE, INSERT, ...).
  • property OnConnect: TNotifyEvent и property OnDisconnect: TNotifyEvent;
    События при подключении и отключении от базы.

TdkMySqlDataSet = class(TdkDataSet)

  • property Connection: TdkMySqlConnection;
  • property SQL: String;

TdkMySqlDataSet расчитан на работу с UTF8 кодировкой, точнее он загружает данные в UTF8, но хранит их в WideString формате.
С выводом текста в стандартные VCL компоненты (например TDBGrid) проблем не возникнет т.к. delphi на лету умеет конвертировать String<=>WideString, зато у компонент, умеющих работать с unicode, не будут теряться уникодные символы.

TFieldHelper = class helper for TField — для Delphi версии >= TurboDelphi

  • property AsMySqlValue: UTF8String;
    Возвращает значение поля в формате MySql. т.е. для строковых полей это utf8 формат; для float — разделитель точка; для дат — формат "год-месяц-день", и т.д.
  • property AsMySqlString: UTF8String;
    Возвращает значение поля пригодным для вставки в sql запрос. (Уже заключённые в кавычки и не требующих дополнительных преобразований).

Для версий Delphi, не поддерживающих helpers, альтернативные функции:

  • function GetAsMySqlValue(Field: TField): UTF8String; и procedure SetAsMySqlValue(Field: TField; const Value: UTF8String);
    Для работы с данными в формате MySql.
  • function MySQLStr(MySQL: IMySQL; const Str: String; EmptyAsNull: Boolean=false): String;
    Для получения значение поля пригодным для вставки в sql запрос.

TdkDataSet = class(TDataSet)

Побочный (но не менеее полезный) продукт — просто DataSet для работы с любыми вашими данными. Абсолютно никак не связан с TMySql.

  • function RecordStatus: TdkRecordStatus;
    Возвращает статус текущей записи (новая, модифицированная).
  • procedure DisableUpdateStatus; / procedure EnableUpdateStatus;
    Если надо на время отключить изменение статуса записей при вставке, редактировании, удалении.
  • function UpdateStatusEnabled: Boolean;
    Проверяет, отключено или нет изменение статуса.
  • procedure Update;
    Перечитывает список отображаемых записей.
    Примером, когда эта процедура нужна, может служить отфильтрованные записи. После изменений или добавления новых записей, при включённом фильтре, записи автоматически не отфильтровываются (т.е. не исчезают с экрана, если эта запись не удовлетворяет условиям фильтра), а остаётся на своём месте. Обновить набор записей (уже с учётом филитра) вы можете этой процедурой.
  • procedure SortOnFields(const AFieldNames: array of WideString; ACaseSensitive: Boolean = False; ADescending: Boolean = False);
    Сортировка по полям.
  • procedure Sort;
    Обновить сортировку.
    После добавления новой записи или изменения существующей, запись не меняет своего положения согласно сортировки, а остаётся на месте. Пересортировать записи можно этой процедурой. (Если до этого сортировки не было ошибок не возникнит).
  • function Find(AFrom: Integer = 0; ATo: Integer = 0): Integer;
    Начинает поиск с AFrom, если AFrom больше нуля, или с текущей позиции(включительно) передавая каждую из записей в OnFindRecord.
    ATo — искать записи до... Если ATo равно нулю значит искать до конца. Если ATo меньше AFrom, значит искать в обратном порядке.
    Функция возвращает номер записи на которой прервался(Accept:=True) поиск или ноль, если поиск достиг конца.
  • property OnFindRecord: TdkFindRecordEvent;
    TdkFindRecordEvent = procedure(ADataSet: TdkDataSet; ARecNo: Integer; var Accept: Boolean) of object;
    При поиске здесь вы решаете, удовлетворяет или нет текущая запись условию поиска...
  • property Modified: Boolean;
    Информирует, были ли данные модифицированы.
  • procedure Save;
    Сохраняет данные, передавая модифицированную, новую или удалённую запись на обработку в OnSaveRecord.
  • property OnSaveRecord: TdkSaveRecordEvent;
    TdkSaveRecordEvent = procedure(ADataSet: TdkDataSet; AStatus: TdkRecordStatus; var Accept, Stop: Boolean) of object;
    При сохранении сюда поступают модифицированные записи для их дальнейшей обработки вами (например записать их в базу).
  • property StreamKind: TdkStreamKind;
    Способ хранения записей (во временном файле, в памяти, в файле подкачки). По умолчанию в файле подкачки.
  • Ну и плюс стандартные для TDataSet функции...
  • Дополнительные функции (для выпендрёжа расширения функциональности):
    • function RecordIndex: Integer;
    • procedure GetRecordList(Dest: TdkIntList);
    • procedure SetRecordList(Source: TdkIntList);
      Для расположения записей в произвольном порядке. Подробности см. в TdkDataSet.

Для работы с файлом подкачки как с временным хранилищем данных задействован класс TRySwapStream с небольшими модификациями (с разрешения и одобрения автора). Если у вас нет желания использовать файл подкачки вы можете закомментировать дериктиву {$DEFINE IncludeSwap} в юните dkDataSet.

unit dkDataSetUtils

  • procedure LoadFromDataSet(Source: TDataSet; Dest: TdkDataSet; FieldsAssign: Boolean);
    Загружает данные из другого TDataSet (Source).
    при FieldsAssign=True копирует все поля Source и их свойства (DisplayFormat, OnGetText и т.д.)

Возможные проблемы

  • Хоть я и старался писать код чисто и на сколько мог проверял результат работы, но как известно уследить и предусмотреть всё не возможно...
  • Код написан на TurboDelphi, тест на совместимость со старыми и новыми версиями Delphi не проводился.
  • Пользователям ранних версий Delphi необходимо закомментировать {$define Helpers} в модулях dkDataSetUtils и dkMySqlDataSet;
  • У пользователей ранних версий Delphi, скорей всего, компилятор ругнётся на не соответствие параметров в переопределённых функциях в модуле RySwapStream (например function Seek(const Offset: Int64; Origin: TSeekOrigin): Int64; overload; override; раньше она вроде была не overload и offset был Longint ...)

Исходные коды классов




Смотрите также материалы по темам:
[mySQL]

 Обсуждение материала [ 13-09-2011 01:54 ] 6 сообщений
  
Время на сайте: GMT минус 5 часов

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

 
© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.

Яндекс цитирования