Прості ODBC класи без використання MFC h2>
Мені довелося написати досить багато програм
пов'язаних з базами даних. Більшість з них було невеликими і використовували
MFC клас CRecordset. Залежність від MFC мене не завжди влаштовувала і тоді я
засів за створення власного класу. Таким чином з'явився набір, що складається
з декількох класів, що забезпечує необхідні можливості для роботи з ODBC
драйвером. p>
Насправді ці класи не претендують на щось
"здійснене" і "потужний", проте вони можуть дуже навіть
стати в нагоді для тих хто захоче працювати з драйвером ODBC безпосередньо через API
функції. p>
У файлах ODBC.h і ODBC.cpp міститься три класи
CODBCCnx, CODBCQuery і CODBCFatQuery. Основним з них є CODBCCnx,
який коннектітся до DBMS, а також здійснює всі необхідні дії з
обробці запитів. CODBCQuery і CODBCFatQuery є зарезервованими, і я
Заплановані з їх допомогою розширити можливості основного класу. p>
Клас CODBCCnx h2>
CODBCCnx містить три функції Connect (), Disconnect ()
і IsOk (). Функція Connect () дозволяє зв'язатися з драйвером DSN або використовуючи
мережеве ім'я комп'ютера. p>
// зв'язуємося з DBMS через DSN, "foodsn" p>
CODBCCnx dsn (); p>
dsn.Connect ( "foodsn", "username", "password "); p>
// Зауваження: CODBCCnx
dsn ( "foodsn", username "," password "); ідентично попередній рядку p>
// перевіряємо успішність з'єднання p>
if (! dsn.IsOk ()){ p>
// успішне з'єднання з базою p>
) p>
else ( p>
// помилка при з'єднанні p>
) p>
// інший спосіб здійснення зв'язку з базою данны,
використовуючи мережеве ім'я комп'ютера p>
CODBCCnx
name ( "SQL
Server "," CompName "," username "," password "); p>
// знову перевіряємо успішність з'єднання p>
if (! name.IsOk ()){ p>
// успішне з'єднання з базою p>
) p>
else ( p>
// помилка при з'єднанні p>
) p>
Отже, ми з'єдналися з базою даних, тепер давайте
спробуємо завершити сеанс зв'язку. Для цього нам стане в нагоді функція Disconnect ().
У параметрах цієї функції можна задавати різні параметри. Наприклад, якщо
транзакції знаходяться в активному стані, то з допомогу цих параметрів можна
повернути їх в початковий стан, або почекати їх завершення. Якщо викликати
функцію Disconnect, без параметрів, то всі транзакції повернуться в початкове
стан. p>
// завершуємо сеанс зв'язку (dsn) p>
dsn.Disconnect ();// повертаємо незавершені транзакції
в попередній стан p>
// Зауваження: dsn.Disconnect (SQL_ROLLBACK) теж саме,
що і попередня рядок p>
// завершуємо сеанс зв'язку з базою "name" p>
name.Disconnect (SQL_COMMIT);// завершуємо всі
незавершені транзакції p>
Клас CODBCQuery p>
Отже, ми розглянули основні дії для спілкування з
базою даних. Але є ще один момент. Чи не полохо було б працювати з об'єктом,
створеним раніше, через покажчики, тобто зробити його доступним з інших
класів. Для цього було створено клас CODBCQuery. CODBCQuery не може використовуватися
як самостійний об'єкт, він постійно прив'язаний до основного класу: p>
// Встановлюємо з'єднання, використовуючи dsn p>
CODBCCnx * pDsn = new CODBCCnx ( "foodsn",
"username", "password "); p>
CODBCQuery qry1,
qry2; p>
if (! pDsn-> IsOk ()) p>
( p>
// успішний коннект!! тепер дамо в доступ даний
сеанс зв'язку:) p>
pDsn-> Connect (qry1.h_qstmt); p>
pDsn-> Connect (qry2.h_qstmt); p>
) p>
else ( p>
// помилка p>
) p>
// так само цю процедуру можна совешніть за один крок. p>
CODBCQuery qry (new
CODBCCnx ( "foodsn", "username", "password"),
true); p>
// або ми можемо брати pDsn і передавати його у зв'язку
нових об'єктів p>
CODBCQuery
qry2 (pDsn), qry3 (pDsn, false); p>
// чи можна змусити клас CODBCQuery самостійно
коннектітся p>
CODBCQuery
qry4 ( "SQL Server", "CompName", "username",
"password "); p>
// використовуючи DSN p>
CODBCQuery qry5 (NULL,
"foodsn", "username", "password "); p>
Заключна замітка: існує глобальна функція
SQLSuccess (). Якщо передати в неї змінну SQLRETURN, то функція поверне не
нульове значення, якщо в цій змінній вказати значення SQL_SUCCESS або
SQL_SUCCESS_WITH_INFO. Іноді повертається інформація буває дуже навіть
корисною. p>
На додаток p>
В архіві містяться два файли strutil.h і strutil.cpp.
Це дуже прості функції мають тип char *. Мене дратує постійна
необхідність щодо виділення пам'яті для strcpy, і т.д. .. Тому мені більше
підходять ці дві функції замість стандартних. Їх назви починаються з jkl_str.
Сподіваюся, вони Вам сподобаються :). p>
Список літератури h2>
Для підготовки даної роботи були використані
матеріали з сайту http://www.realcoding.net/
p>