Дмитрий Ларионов дата публикации 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 сообщений |