Newsgroup: it.comp.lang.c++
Titolo: Cerco piccolo esempio VC++4.0 x creazione ed uso di recordSet in Access

Stņ cercando un piccolo esempio in VC++4.0 sulla creazione ed uso di
recordset in Access.
Semplicemente per rendermi conto della complessitą. Sono un novizio del C++.
Cerco qualcosa di simile in VC++ di quello che sarebbe in VB:
Dim db as Database
Dim rs as RecordSet
    Set db = OpenDatabase("pippo.mdb")
    Set rs = db.OpenRecordset("SELECT * FROM TABELLA", dbOpenDynaset)
    If rs.RecordCount > 0 Then
        Do Until rs.EOF
            Label1.Caption = rs!Campo1
        Loop
    End If
Naturalmente senza pretese, qualunque cosa possa somigliare o riguardi
l'argomento č ben accetto.
Grazie di cuore
Pak
pa...@citynet.re.it
 (togliere una k dall'indirizzo)

l'argomento è ben accetto.
Qualcosa del genere dovrebbe essere strettamente equivalente:
    CDatabase db;
    db.Open("pippo.mdb",    // dev'essere stato definito come data-source-name
        FALSE, TRUE, "ODBC;", FALSE);
    CRecordset rs(&db);
    rs.Open(CRecordset::dynaset, "Select * From Tabella");
    while(!rs.IsEOF()) {
            CString stringa;
            rs.GetFieldValue("Campo1",stringa);
            m_label1.SetWindowText(stringa);
    }
Questo riproduce anche i difetti dell'originale (nessun controllo di
errore; i diversi valori assegnati al testo della label si sovrascrivono
a vicenda per cui resta solo l'ultimo, ecc).
Differenze da notare: il recordset prende l'indirizzo del database
gia` nel costruttore; "pippo.mdb" deve essere stato definito come
DSN (Data Source Name) ad esempio coi normali strumenti
amministrativi dell'ODBC; gli altri argomenti di Open non sono, di solito,
necessari, ma qui si` per poter definire un dynaset (notiamo che
qui non si *usa* davvero la piu` ricca funzionalita` del dynaset, e
un piu` efficiente recordset "forward only" o "snapshot" basterebbe,
e quindi non occorrerebbe esplicitare gli altri argomenti di Open, bensi`
li si potrebbe lasciare ai valori di default).
Non ho usato la GetRecordCount del recordset (equivalente
all'accesso a RecordCount dell'esempio VB) perche` il test su
EOF (IsEOF in VC++, accesso ad EOF in VB) e` sufficiente.
Nella Open del recordset, volendo l'intera tabella, si specificherebbe
normalmente il solo nome della tabella piuttosto che non l'intera
istruzione SQL di Select -- comunque, non ci sono problemi anche
a dare l'intera istruzione, come in questo esempio.
Il campo m_label1 deve essere stato connesso al controllo in cui
si vogliono mostrare i valori (ad esempio con class wizard, oppure
in vari possibili modi nel proprio codice).  Alternativamente, senza
bisogno di "connessioni", si scriverebbe di solito:
    SetDlgItemText(IDC_LABEL1, stringa);
dove IDC_LABEL1 e` l'identificatore del controllo che interessa.
Per la gestione degli errori, cosi` come in VB normalmente si
userebbe ON ERROR, cosi`, in VC++, si userebbe il piu`
flessibile costrutto try/catch previsto, appunto, dal linguaggio C++.
Un equivalente un po' piu` "normale" in VC++ sarebbe dunque:
    try {
        CDatabase db;
        db.Open("pippo.mdb");
        CRecordset rs(&db);
        rs.Open(CRecordset::forwardOnly, "Tabella");
        while(!rs.IsEOF()) {
            CString stringa;
            rs.GetFieldValue("Campo1",stringa);
            SetDlgItemText(IDC_LABEL1, stringa);
        }
    } catch(CDBException* pExcept) {
        // diagnostica dell'errore
    }
con funzionalita` grosso modo equivalente (eccetto che
eventuali errori verranno meglio diagnosticati:-).
Normalmente, in VC++, si definirebbe una classe _derivata_
da CRecordset (facendosi aiutare dall'opportuno Wizard),
basata sull'effettiva struttura della tabella da interrogare.  E`
comunque possibile, come in questo esempio, anche un
procedimento piu` "dinamico", utile sostanzialmente quando
NON si conosce a priori la struttura della tabella (caso non
frequente, ma che ha la sua importanza in applicazioni
abbastanza avanzate).
Alex