Bonjour,

Code : 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
int CHowToADOView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    HRESULT hr = m_pConnection.CreateInstance(__uuidof(ADODB::Connection));
    if (FAILED(hr))
	 {
		AfxMessageBox(_T("CREATE CONNECTION INSTANCE ERROR !!!"));
	 }
    m_pConnection->CursorLocation = ADODB::adUseClient;
    HRESULT hr2 = m_pConnection->Open(L"Provider=MSDAORA.1;Password=systemtest1;User ID=system;Data Source=test1sid_10.12.1.2;Persist Security Info=True", L"",L"", ADODB::adConnectUnspecified);
    if (FAILED(hr2))
	 {
		AfxMessageBox(_T("OPEN CONNECTION ERROR !!!"));
	 }
    return 0;
}
 
void CHowToADOView::OnBnClickedOpenschema2()
{
    // open it
    try
    {
        _variant_t vSourceSchema = L"MYSCHEMA";
        _variant_t vSource = L"TABLE1";
 
        _variant_t varCriteria[3];
        _variant_t vtNull;
        vtNull.vt = VT_NULL;
        varCriteria[0] = vtNull;
        varCriteria[1] = vtNull;
        varCriteria[2] = vSource;
 
        // Creating a safe array of variants with 3 elements.
        VARIANT varData;
        SAFEARRAY FAR* psa;
        SAFEARRAYBOUND rgsabound[1];
        rgsabound[0].lLbound = 0;
        rgsabound[0].cElements = 3;
        psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
 
        // Fill the safe array.
        for(long lIndex = 0 ; lIndex < 3 ;lIndex++)
        {
            SafeArrayPutElement(psa, &lIndex,&varCriteria[lIndex]);
        }
 
        // Initialize the safearray.
        varData.vt = VT_VARIANT | VT_ARRAY;
        V_ARRAY(&varData) = psa;
 
        ADODB::_RecordsetPtr tempRS;
        tempRS = NULL;
        tempRS.CreateInstance( __uuidof( ADODB::Recordset ) );
        tempRS = m_pConnection->OpenSchema(ADODB::adSchemaColumns,varData);
        if (!(tempRS->GetADOEOF()))
            AfxMessageBox(_T("IL Y QUELQUES CHOSES DANS tempRS"));
        else
            AfxMessageBox(_T("IL N'Y A RIEN DANS tempRS"));
    }
    catch (_com_error& e) 
    {
        CString str = (CString)(e.Description().GetBSTR()) +"\r\n"+ (CString)(e.ErrorMessage());
        AfxMessageBox(str);
    }
}
Comme vu dans le code, j'utilise OpenSchema sur une base de données ORACLE. Bof ! Après cette fonction, une exception est immédiatement détectée par le try...catch... Et si je mets pour test varData = vtNull, pas d'exception mais le recordset retourné ne contient rien (adoEOF = true).
Est-ce que OpenSchema(adSchemaColumns) ne marche pas pour Oracle ? Vu dans l'aide MSDN (http://technet.microsoft.com/en-us/l.../ms974585.aspx), il n'indique rien en ce qui concerne Oracle seulement pour ole db, vsam et AS400 !!