You are here

Библиотека CA-Visual Objects для MySQL

library

Много лет назад, когда встал вопрос о переходе из DBF в SQL мне настоятельно порекомендовали использовать библиотеку Vo2Ado, автор которой, если мне не изменяет память – Robert van der Hulst. Очень удачная, простая, а главное – бесплатная библиотека.

Но (скажут мне) у CA-Visual Objects уже есть своя родная библиотека «SQL Classes»!.. Есть. Но, как-то не сложилось. Да и, по отзывам некоторых знакомых – Vo2Ado работает лучше и быстрее. Так что я с удовольствием пользовался Vo2Ado до появления версии Vo2Ado28 (для CA-Visual Objects 2.8). Именно с этой версии, Vo2Ado стало платным. Лишних денег не бывает. И я решил осмотреться и подумать...

 
Очень частое критическое замечание: Vo2Ado для MySQL не удобен, т.к. сначала надо ставить, а потом – настраивать драйвер каждому пользователю… Таким критикам, я с полной ответственностью заявляю: если подойти «с умом», то достаточно простой инсталляции стандартного ODBC-драйвера MySQL и ничего настраивать не надо! Хотя, самой установки драйвера, конечно же – не избежать. (За исключением MS SQL – здесь установка драйвера не нужна, т.к. он автоматически ставится вместе с Windows). Как так можно сделать – отдельная тема. Так что, Vo2Ado – рулит!
 
С некоторых пор, я работаю преимущественно с MySQL. И, общаясь на разные темы, я вышел на Александра Белова (г. Рига), который помог мне с очень многими вопросами. А главное – заронил мысль, что «не святые горшки обжигают». Т.е., при некотором желании и упорстве – любому программисту CA-Visual Objects (КаВо – по-русски) вполне по силам написать свою библиотеку для работы со своим любимым SQL.
 
Именно так он со своим товарищем сделали для себя библиотеки по работе с MySQL, FB и SQLite. Тут мне стало очень любопытно, и я попросил прислать хоть кусочек кода по работе с MySQL. Что и получил. Рассмотрев пример, я решил на его основе (а пример был сделан под MySQL 4.xx) сделать свой класс, но похожий на Vo2Ado.
 
Почему так? Во-первых, чтобы не переписывать код своих программ. Во-вторых, а если захочется вернуться на Vo2Ado (купив, например, Vo2Ado28). А, в-третьих – стандарт ADO достаточно неплох. Короче – мне нужна полная совместимость.
 
Ещё я нашёл похожую, но, к сожалению, нерабочую библиотеку Hernando Patino mySQL4VO_1007. Hernando сделал своё творение на основе стандартной библиотеки КаВо «SQL Classes». Что, для одних, может быть – и хорошо, а для других – не очень. Почему библиотека нерабочая? Во-первых, она недоделана, содержит ошибки (просто так в КаВо28 не собирается), а, во-вторых – она сделана под MySQL 4.хх. А, как известно, описание функций и структур в библиотеке MySQL для версий 4 и 5 – отличаются.
 
Похоже, что Hernando Patino в своём детище решил сделать полную «кальку» библиотеки SQL Classes, что заставило его перенести почти все функции и структуры из библиотеки libmysql.dll. Но, т.к. MySQL в четвёртой версии бурно развивался – он не поспевал за изменениями и, мне кажется, надорвался. Последняя его публично выложенная версия 1.0.0.7. Надеюсь, что я ошибаюсь.
 
Подробно рассказывать, что и как я сделал в своей библиотеке – не буду, т.к. это уже формат статьи. Но, постараюсь что-то вкратце осветить.
 
Первое, с чем я определился – это то, что в основе должна быть стандартная библиотека libmysql.dll (connector C). И все функции – будут браться из неё, см. соответствующий раздел MySQL_Developer_Zone. Функций и структур должно быть немного, только то, что реально используется. Потом, я определил основные классы, которые использую в своих программах (а у меня всегда минимум классов Vo2Ado). У меня их вышло три: AdoConnection, AdoCommand и AdoRecordSet. AdoServer, как нестандартный – решил не использовать. Тем боле, что когда мне нужно индексировать данные, делать «хитрый» поиск и т.д. и т.п. – я применяю другие классы, сделанные с помощью AdoRecordSet.
 
Следующий момент – я решил внести некоторые правки и добавить новые возможности:
 
  • Решить вопрос с разностью представления данных для полей типа Date, DateTime и TimeStamp (дата, объект, строка). И сделать возможность этим управлять.
  • Решить вопрос с «глюком» отображения больших целочисленных полей (в Vo2Ado27 поля типа int, long int и т.п. выводятся как строка).
  • В популярном классе «bBrowser» с некоторых пор заявлена возможность использования AdoRecordSet (но bBrowser с AdoRecordSet из Vo2Ado27 реально не работает) – захотелось это исправить!..
  • Решил поправить класс AdoDateTime (из Vo2Ado27). Т.к. он не умеет работать (инициализироваться) со стандартной SQL-строкой формата TimeStamp.
 
Всё это мне удалось!   :))
 
По первому вопросу – я добавил методы для управления свойствами полей:
oConn:__ModeDateTime        := #AsDate
oConn:__ModeTimeStamp      := #AsString
 
Допустимые режимы: #AsString, #AsDate, #AsDateTime
Значения по умолчанию:
            для DateTime              DateTime
            для TimeStamp           String
 
А по третьему вопросу – вынужден был дописать методы:
DbStruct, Deleted, FieldPos, FieldSpec, FieldSym, GoBottom, GoTo, GoTop, LastRec, Notify, RecCount, RecNo, RegisterClient, ResetNotification, UnRegisterClient и Used.
 
И скорректировать EoF, BoF и FieldGet.
 
Что ещё сделал? Для класса AdoConnection – добавил метод задания опций соединений. (См. описание API-фунции mysql_options() из libmysql.dll). С помощью неё можно, например, задать кодовую страницу клиента:
 
LOCAL oConn AS AdoConnection
   . . .
   . . .
oConn:__Options( MYSQL_SET_CHARSET_NAME, "cp1251" )
 
Это нововведение позволяет отказаться от любых настроек в MySQL для клиента, например, как рассказано здесь. Таким образом – всё в Ваших руках!
 
А ещё, для класса AdoRecordSet сделан очень удобный метод Data ( AdoRecordSet:Data ), который сразу позволяет получать все данные выборки, не прибегая к GetRows(). Аналогично классу bArrayServer ( bArrayServer:Data ).
 
Попутно, в свою библиотеку (msMySQL) я вложил ещё один класс – msLogFile (сделан на основе LogFile). Этот класс не меняет принудительно расширение .log-файла на стандартное. Меня это всегда доставало. Плюс, у него появился новый режим использования. При указании, во время инициализации, в качестве параметра «lOpen» значения TRUE – файл остаётся открытым до окончания работы с ним (Close()). Это очень удобно в случае, когда в вашей программе постоянно что-то пишется в файл отчёта. Стандартный же класс, всегда открывает-закрывает файл при каждой операции чтения-записи. А это, при включённом антивирусе – солидные задержки времени!
 
 
Достоинства:
  • Почти полная совместимость с Vo2Ado, но работает быстрее.
  • Установка и настройка драйверов MySQL – не нужна.
  • Настройка MySQL для работы с клиентом – не требуется.
  • Бесплатность
 
Оставшиеся проблемы:
  • Как и в Vo2Ado, не разрешены пакетные запросы. Включить можно, но нужна доработка кода и потеряется некоторая совместимость с Vo2Ado.
  • Как и в Vo2Ado, не обрабатываются переменные типа LONG LONG. Вещь достаточно редкая и КаВо это всё равно напрямую не понимает. Но решить это можно, только придётся, опять же, дописывать код и попутно править, например bBrowser и другие классы, где это может использоваться напрямую
 
В общем, кому интересно – добро пожаловать в раздел поддержки! Скачивайте библиотеку msMySQL, тестируйте и наслаждайтесь. Пользование – бесплатное. Сообщения о «глюках» и недоделках – приветствуются. Писать здесь.
 
 

25.04.2012 г.   Карандаш.

 
 
24.05.2012 - Версия 1.0.0.3
 
  1. Поправлен метод msLogFile:Close(). Ускорена операция закрытия.
  2. Исправлен «глюк» при работе с CA-Vo 28 SP3.
  3. Для упрощения пользования - нужная кодовая строка задаётся теперь в виде строкового значения (ранее, в виде PSZ).
  4. Сделан метод RecordSet:GetRow(). Ранее он был объявлен, но фактически не работал.
  5. В методе RecordSet:FieldPos() исправлен поиск позиции поля, при указании в качестве параметра – его строкового имени (для числового и символьного работало нормально).
  6. Исправлена работа метода RecordSet:__Data() для случая, когда выборка делается не всем полям по порядку (т.е., когда выборка выборочная, в случайном или повторяющемся порядке).
 
21.06.2012 - Версия 1.0.0.4
 
  1. Добавлена функция mysql_num_rows().
  2. Исправлен метод AdoAdo:Init(). Ранее из-за этого не работала очистка памяти для ряда классов.
  3. Исправлен подсчёт обработанных записей при операциях INSERT, UPDATE, DELETE. См. методы AdoConnection:Execute() и AdoCommand:Execute().
  4. Исправлен метод AdoRecordSet:Open(). Ранее могло сбиваться значение AdoRecordSet:Source.
  5. Для Класса AdoRecordSet добавлены "родные" методы доступа: AdoRecordSet:CursorType и AdoRecordSet:LockType
  6. Исправлен метод AdoRecordSet:Close(). Добавлена генерация события для работы "неродных" дополнительных методов.
  7. Улучшена работа дополнительного "неродного" метода AdoRecordSet:Notify().
  8. Сделан класс AdoServer. Класс работает только в режиме ReadOnly со статической выборкой. Поэтому, реализованы не все "родные" методы, а только следующие:
BoF, DbStruct, EoF, FCount, FieldGet, FieldPos, LastRec, NullAsBlank (ACCESS, ASSIGN), RecCount, RecNo (ACCESS, ASSIGN), RecordSet (пока только ACCESS), Source (ACCESS, ASSIGN), Used, Close, Commit, Deleted, GoBottom, GoTo, GoTop, Notify, OrderBy, Requery, ResetNotification, Skip, SuspendNotification.
 
  1. Дополнительно, для класса AdoServer сделаны «неродные» методы FieldInfo и FieldSpec.
 
10.07.2012 - Версия 1.0.0.5
 
  1. Исправлена типизация функции mysql_close().
  2. Вставлена обработка ситуации, когда число строк в получаемой выборке (например, при выполнении SELECT...) больше максимального значения диапазона значений DWORD. Теперь, в этом случае (для совместимости кода в VO) выборка принудительно ограничиваться 4294967295 - 1 строкой.
 
25.07.2012 – Версия 1.0.0.6
 
  1. В AdoServer исправлена работа с сообщениями для следующих методов: Commit(), GoBottom(), GoTo(), GoTop(), Skip().
  2. В AdoServer исправлены методы доступа BoF и EoF.
  3. В классе AdoRecordSet (в связи с особенностями определения BoF) исправлены методы: __UseData(), __Data(), GoBottom(), GoTo(), GoTop(), Skip().
 

05.09.2012 - Версия 1.0.0.7
 
  1. В классе msLogFile подправлен метод Axit() ( убраны лишние строки ).
  2. Для повышения совместимости в очередной раз ограничено максимальное число записей до величины 2147483647 - 1 ( максимальное положительное LONG - 1 = 0x7FFFFFFF - 1 ).
  3. В классе msAdoRecordSet для повышения совместимости уточнена размерность некоторых переменных, и скорректированы методы: RegisterClient() и ResetNotification().
  4. В классе AdoConnection изменена настройка по умолчанию для symModeTimeStamp с #AsString на #AsDateTime. Т.е., теперь поля формата TimeStamp по умолчанию будут выводится не как строки ( STRING ), а как DateTame ( объект DateTime ).
 

16.10.2012 – Версия 1.0.0.8
 
  1. В классе AdoServer исправлен метод OrderBy().
 
       24.11.2012 – Версия 1.0.0.9
 
  1. Исправлен метод AdoRecordSet:__UseData().
       Ранее конвертация типа «CAST( '' AS Char(13) ) AS Test» по какой-то причине могла создавать поле типа "С", Len 13, Dec 31 и т.п.
       Поэтому, для строковых полей сделан принудительный сброс числа десятичных знаков в ноль.
 
 
08.01.2013 – Версия 1.0.0.10
 
  1. Небольшие косметические изменения.
 
      16.07.2013 – Версия 1.0.0.11
 
1.            В классе AdoConnection:
1.1.      Добавлена переменная: HIDDEN liTransactionLevel AS LONG // Level of transactions.
1.2.      Соответственно, изменены методы Init() и Close(), и исправлены методы: BeginTrans(), RollBackTrans() и CommitTrans().
2.            Если долгое время не было запросов, сервер может самостоятельно закрыть соединение, или может произойти потеря соединения по иной причине (обрыв связи, выключение сервера и пр.). Тогда при включённой опции автоматического восстановления соединения, многие функции, например mysql_real_query() - могут начать вызывать огромные задержки, создавая эффект "зависания" приложения. Чтобы разработчику облегчить (или позволить обойти) данную ситуацию:
2.1.      В модуле "_Function – MySQL" добавлена новая функция mysql_ping().
2.2.      В классе AdoConnection добавлен метод контроля активности соединения __IsOpen:ACCESS.
3.            С учётом создания уточняющего метода __IsOpen изменены методы:
         AdoCommand:Execute()
         AdoConnection:BeginTrans()
         AdoConnection:CommitTrans()
         AdoConnection:RollBackTrans()
         AdoConnection:__Query()
         AdoRecordSet:Open()
4.            Обновлён модуль "msAdoConnection – Defines".
5.            С учётом того, что: "The object's State property can have a combination of values. For example: If a statement is executing, this property will have a combined value of adStateOpen and adStateExecuting. If a recordset is fetching rows this property will have a combined value of adStateOpen and adStateFetching",
уточнена работа методов:
         AdoConnection:BeginTrans()
         AdoConnection:CommitTrans()
         AdoConnection:RollBackTran()
         AdoConnection:__Query()
         AdoRecordSet:__UseData()
6.            Модуль "msAdoProperties" переименован в "msAdoProperty".
7.            Модуль "msAdoErrors" переименован в "msAdoError".
8.            Класс-заглушка msPrompt переименован в AdoProperty и перемещён в модуль "msAdoProperty".
9.            Модуль "msPrompt" - удалён.
10.        Уточнён метод доступа AdoObject:Error:ACCESS.
11.        Скорректированы методы инициализации:
         AdoObject:Init()
         AdoAdo:Init()
         AdoCollection:Init()
         AdoErrors:Init()
         AdoProperties:Init()
12.        Скорректирована работа с ошибками в методах: AdoConnection:__ErrorMsg(), AdoConnection:__Query() и AdoConnection:Open().
13.        Для гибкости работы с коллекциями:
13.1. Добавлена глобальная переменная: STATIC GLOBAL liMyCollectionBase AS LONG, начальное значение - 1.
13.2. И функция AdoCollectionBase().
14.        Исправлен метод AdoCollection:Add2Cache() при работе с коллекцией ошибок.
15.        Исправлен метод доступа AdoCollection:Item:ACCESS для режима, когда задан строковый параметр, включена обработка и символьного параметра.
16.        Уточнён метод AdoConnection:Destroy().
17.        Для работы с дополнительными внутренними опциями MySQL, созданы методы: AdoConnection:__Option() и метод доступа AdoConnection:__Option:ACCESS.
18.        Соответственно, (под это же) переделан метод AdoConnection:Open().
Примечание:
В методе AdoConnection:__Option() реально пока можно управлять следующими опциями:
         MYSQL_SET_CHARSET_NAME
         MYSQL_OPT_RECONNECT
19.        Как ставшая ненужной, в классе AdoConnection удалена переменная cCharSet, и связанные с ней методы: __CharSet:ACCESS и __CharSet:ASSIGN.
Примечание:
Теперь по умолчанию, используется кодовая страница самого MySQL
(ранее принудительно ставилась CP1251) и, если её надо сменить – можно использовать метод __Options.
Например:
AdoConnection:__Options( MYSQL_SET_CHARSET_NAME, "cp1251" ) // Русская кодировка
 
 
      16.09.2013 – Версия 1.0.0.12
 
  1. Исправлен ресурс: "RESOURCE VERSIONINFO". А именно: исправлена поддержка английского языка, теперь в свойствах .dll-файла показывает, что есть русский и английский язык.
  2. Для удобства пользователей, в .aef-файле в модуле "Version" сделана заметка о дате и версии.
 
      19.09.2013 – Версия 1.0.0.13
 
  1. Оптимизированы ключи компиляции. Несколько увеличилась скорость работы классов.
 
      06.03.2016 – Версия 1.0.0.15
 
  1. В классе AdoServer скорректированы методы Axit, Close и OrderBy.
  2. Удалён, как ненужный, метод Destruct.
  3. Оптимизирован класс msLogFile.
 
 
          Для скачивания самой свежей версии - ССЫЛКА .
 

Comments

Эта тема обстоятельная, и требует более пристального рассмотрения. Думаю увидим в будущих публикациях.

Theme by Danetsoft and Danang Probo Sayekti inspired by Maksimer