Bonjour,

Je voudrais faire un test rapide de connexion avec l'aide d'un OpenQuery.
Mais ça marche pas (forcement puisque je suis là ^^).

Je travail avec SQL-Server 2008 et un Oracle (heeee là je sais pas trop quel version en fait).
Coté application client je ne vois que SQL-Server.

J’exploite une connexion ADO via l'OleDb.
Ne ne peut pas modifier la configuration du serveur (donc "sp_configure 'remote login timeout', 1" c'est pas possible)

Mon code (c'est du C++ dans Builder5, bientôt Builder10 mais ça ne devrait pas changer grand chose)
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
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 l’interdire 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;
}

L'idée est donc un test rapide, si Oracle n'est pas disponible ou ne répond pas dans la seconde je voudrais recevoir une exception.

Si quelqu'un à une solution (autre que de modifier la config serveur) ça serait vraiment cool ^^
(Peut être autour de "EXEC sp_executesql" mais je ne trouve comment définir un timeout, ni s'il ne vas pas lui aussi s’incrémenter du 'remote login timeout' ...)

Amicalement
Merci d'avance
PS : Mon problème est quand le serveur Oracle n'est pas disponible (crash quoi)