1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
   |  
const char* c_SQL_TestDispoOracle =
    "SELECT"
    "   count(*) as un"
    "  FROM"
    "   OpenQuery(ServeurOracle,'SELECT 1 AS un FROM DUAL')";
 
bool m_GetOracleInfo_LastTestResult;	
 
bool __fastcall GetOracleInfo_Dispo()
{
    bool ValRetour=false;
    int Sauv__ADOConnect_ForTestOracle;
    TCustomADODataSet* MyCustomADODataSet;
 
    //Si la connexion est active
    if (this->ADOConnect->State ==  TObjectStates() << stOpen)
    {
        //Création d'un dataset pour récupérer les données
        MyCustomADODataSet = new TCustomADODataSet(this);
        if (MyCustomADODataSet != NULL)
        {
            //Sauvegarde le timeout de la connexion
            Sauv__ADOConnect_ForTestOracle = this->ADOConnect->CommandTimeout;
            try
            {
                try
                {
                    //Modif du timeout (1 seconde d'attente max)
                    //  ADO/OleDb/SQLServer ? ajoute automatiquement un délai pour l'OpenQuery
                    //           configuré niveau serveur "sp_configure 'remote login timeout', n"
                    //           avec n en seconde (je dé-conseil fortement de le modifier)
                    //  VW : Je n'ai pas trouvé comment linterdire coté client
                    this->ADOConnect->CommandTimeout = 1;
 
                    //Exécute la commande de test d'oracle
                    MyCustomADODataSet->Recordset = this->ADOConnect->Execute (c_SQL_TestDispoOracle,
                                            TCommandType(),
                                            TExecuteOptions());
 
                    //Test le nombre de ligne lue (normalement 1 si non oracle non dispo)
                    ValRetour = (bool)(MyCustomADODataSet->RecordCount == 1); //<- set la valeur de retour
 
                }
                catch (Exception &exception)
                {
                    //Oracle non dispo
                    ValRetour=false; //<- set la valeur de retour
                }
            }
            __finally
            {
                //Redéfini le timeout d'origine
                this->ADOConnect->CommandTimeout = Sauv__ADOConnect_ForTestOracle;
                //Supprime le dataset crée
                delete MyCustomADODataSet;
            }
        }
    }
    //Sauvegarde le resultat du dernier test
    m_GetOracleInfo_LastTestResult = ValRetour;
    //Retourne le résultat
    return ValRetour;
} | 
Partager