Connector представляет собой несложную утилиту, простое консольное приложение, которое используется для проверки соединения с нужной базой данных Oracle.
Необходимость в подобной утилите возникает время от времени при возможных проблемах доступа в ту или иную среду (тестовую, среду разработки или продуктивную).
Конечно, выполнить подключение в БД несложно при использовании программ типа SQL Navigator или SQL Developer. (Небольшое затруднение состоит в том, что при наличии большого количества схем, с которыми приходиться иметь дело, где-то нужно еще хранить информацию о параметрах подключения).
Поэтому мною была написана несложная утилита для проверки подключения.
Программа работает с конфигурационным файлом, из которого считываются параметры подключения.
Конфигурационный файл – это обычный текстовый файл, в котором можно собрать параметры подключения ко всем нужным средам.
[Dirs]
Tmp=Tmp
Log=Log
; При наличии в файле нескольких секций с одинаковым именем принимаются параметры той секции,
; которая расположена выше. Поэтому, для того, чтобы просто изменить параметры коннекта,
; достаточно перенести нужную секцию [DB] наверх (используя copy/past)
; Параметр может использоваться в закодированном виде.
; Признак наличия кодирования определяется по префиксу {CODE}
; Через двоеточие в префиксе {CODE} может быть задан способ кодирования
; Валидные значения способа кодирования INTEXP, RAPL, CALLEX
; INTEXP и RAPL - синонимы.
; По умолчанию используется INTEXP.
[DB] ; RAPL prod, via client
UseOraClient=yes
UserName=rapl
Password={CODE}2689854434440530446/22100
TnsName=ICT6GT.SOVINTEL.NET
; ok, 06/10/2017
[DB] ; RAPL prod, direct
UseOraClient=no
UserName=rapl
Password={CODE}2689854434440530446/22100
Server=ics6gt.vimpelcom.ru
SID=ICT6GT
; ok, 06/10/2017
Программа считывает параметы первой секции [DB] и далее выполняет попытку соединения к схеме и серверу, которые были в ней указаны.
О результатах соединения сообщается в текстовом журнале (он формируется в каталоге LOG с именем вида Connector_YYYY_MM_DD_HH_MI_SS.log).
Ниже приведен пример журнала.
В случае неудачного подключения текст сообщения в журнале будет, разумеется, иным.
Для реализации данного несложного проекта была использована интергированная среда разработки Borland C++ Builder (v.6.0)
Для доступа к БД Oracle использовался компонент ODAC (в данном случае версии 6.9)
#include <vcl.h>
#include "USL.h"
#include "stdio.h"
namespace sln = SL_Names;
sln::TSL *sln::SL;
#pragma argsused
int main(int argc, char* argv[])
{
sln::SL = new sln::TSL(argc, argv);
sln::SL->Init();
sln::SL->Run();
delete sln::SL;
return 0;
}
В файле сначала конструируется объект класса TSL (представляющий собой программу), затем происходит инициализация (метод Init), вызов кода выполнения (метод Run). По завершении объект-программа удаляется.
#ifndef USLH
#define USLH
#include "vcl.h"
#include "Ora.hpp"
#include "SyncObjs.hpp"
#include "USL_Cfg.h"
#include "UAL_Log.h"
#include "UAL_Prg.h"
namespace AL = AL_Names;
namespace SL_Names {
class TSL : public AL::TAL_Prg {
...
public:
__fastcall TSL(int argc, char** argv);
virtual __fastcall ~TSL(void);
void __fastcall Run(void);
...
};
extern TSL *SL;
};
#endif
/* Процедура выполнения
*/
void __fastcall TSL::Run(void)
{
printf("%s: SIMPLE\n", FileName.c_str());
printf("Writing to log %s\n", FLogName.c_str());
if(FDoBasic == true) {
DoBasicStart();
DoBasic();
DoBasicEnd();
}
printf("Thanks\n");
}
Как видно, здесь осуществляется вызов процедуры DoBasic(), в которой и сосредоточен весь полезный код по проверке соединения с БД.
void __fastcall TSL::DoBasic(void)
{
MsgLog = "Выполняется соединение к серверу БД Oracle...";
MsgLog = "Применяются параметры конфигурационного файла (секция [DB]).";
if(FCfg->DbUseOraClient == true) {
MsgLog = "Используется ora-клиент.";
MsgLog = Format("Строка коннекта конструируется как: %s\/%s@%s", ARRAYOFCONST((
"UserName", "Password", "TnsName"
)));
MsgLog = "Значения параметров:";
MsgLog = Format("UserName=%s", ARRAYOFCONST((FCfg->DbUserName)));
MsgLog = Format("Password=%s", ARRAYOFCONST((FCfg->DbPassword)));
MsgLog = Format("TnsName=%s", ARRAYOFCONST((FCfg->DbTnsName)));
MsgLog = Format("Строка коннекта: %s\/%s@%s", ARRAYOFCONST((
ValidCfg(FCfg->DbUserName, "UserName")
, ValidCfg(FCfg->DbPassword, "Password")
, ValidCfg(FCfg->DbTnsName, "TnsName")
)));
} else {
MsgLog = "Ora-клиент не используется.";
MsgLog = Format("Строка коннекта конструируется как: %s\/%s@%s:%s:%s", ARRAYOFCONST((
"UserName", "Password", "Server", "Port", "SID"
)));
MsgLog = "Значения параметров:";
MsgLog = Format("UserName=%s", ARRAYOFCONST((FCfg->DbUserName)));
MsgLog = Format("Password=%s", ARRAYOFCONST((FCfg->DbPassword)));
MsgLog = Format("Server=%s", ARRAYOFCONST((FCfg->DbServer)));
MsgLog = Format("Port=%s", ARRAYOFCONST((FCfg->DbPort)));
MsgLog = Format("SID=%s", ARRAYOFCONST((FCfg->DbSID)));
MsgLog = Format("Строка коннекта: %s\/%s@%s:%s:%s", ARRAYOFCONST((
ValidCfg(FCfg->DbUserName, "UserName")
, ValidCfg(FCfg->DbPassword, "Password")
, ValidCfg(FCfg->DbServer, "Server")
, ValidCfg(FCfg->DbPort, "Port")
, ValidCfg(FCfg->DbSID, "SID")
)));
}
try {
if(FOra->Connected == true) {
FOra->Disconnect();
}
FOra->Options->Net = FDbNet;
FOra->ConnectString = FDbConnectString;
FOra->Connected = false;
FOra->Connected = true;
} catch (Exception &e) {
AnsiString S;
S = Format("ERR: неудачное соединение: %s", ARRAYOFCONST((e.Message)));
MsgLog = S;
return;
}
MsgLog = "Успешное соединение!";
}
В процедуре на основании сформированных параметров происходит формирование строк-сообщений в файл журнала (с помощью свойства MsgLog). Затем используется объект FOra для организации коннекции к нужной базе. В случае соединения формируется строка. Объект FOra представляет собой экземпляр класса TOraSession (библиотека ODAC).