Newsgroup: it.comp.lang.visual-basic
Titolo: [TUTORIAL] Wodka alle prese con i primi 3tier ....Come vado?[lungo se non interessa non leggerlo]

Ignoranza abissale sopra di me!
allora ho fatto un po di prove e funziona!
riferimento:
win98SE VB6sp5 ADO2.7
database....ehm su sta slitta ora si prova con Access ...poi metto msde!
 ho usato come database il Biblio.mdb
Mi son fatto una dll ActiveX
Dentro c'ho messo 2 Classi:
Autori e DB
Nella classe autori ci metterò un metodo
ListaAutori che mi propina la lista degli autori...
Nella classe DB ho messo tutta la gestione della connessione ed
interrogazione db
per ora ci son 2 metodi
Public Function ApriRecordset(ByVal TSQL As String, Optional ByVal
TipoCursore As String = "Keyset", Optional ByVal TipoLock As String =
"ReadOnly") As Object
Set mRs = New ADODB.Recordset
mRs.CursorType = adOpenStatic
mRs.LockType = adLockReadOnly
mRs.Source = TSQL
Me.TipoDB = 1
mRs.ActiveConnection = Me.ConnettiDB
mRs.Open
If (mRs.State = adStateOpen) And (Not mRs.BOF) Then
    Set ApriRecordset = mRs
    Else
    Set ApriRecordset = Nothing
End If
End Function
Public Function ConnettiDB() As Object
Set mCn = New ADODB.Connection
Select Case Me.TipoDB
    Case 0, 1
    'Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\LAVORIvb\Prove\3Tier\dbTest.mdb;Persist Security Info=False
    mCn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &
(App.Path & "\dbtest.mdb")
    mCn.CursorLocation = adUseServer
End Select
    mCn.Open
    If mCn.State = adStateOpen Then
        Set ConnettiDB = mCn
        Else
        Set ConnettiDB = Nothing
    End If
End Function
e la proprietà tipoDB
per prova non è gestito nulla lo apre readOnly e percorso assoluto...serve
tutto a vedere se capisco...poi lo rifinisco e rendo versatile per almeno
msde...(mi piacerebbe provare anche postgresql)
Ho fatto una app di prova
dove
Dim tRs As New ADODB.Recordset
Dim Server As New DB
Private Sub cmdRecordset_Click()
Set tRs = Server.ApriRecordset("SELECT * FROM Authors")
tRs.MoveLast
tRs.MoveFirst
MsgBox CStr(tRs.RecordCount)
End Sub
eh eh...cavolo funzia...va beh è readonly però non si incazza anche se
lancio 2 o 3 programmi di test
OK lo step successivo
La classe Autori dovrebbe avere il metodo
ListaAutori
e quindi?
richiamare i metodi della classe DB accedere al motoreDB farsi dare il
recordset della query...e?
1 problema)
La classe autori ha pari dignità(visibilità per il client) rispetto a DB
invece dall'esterno si dovrebbe vedere solo Autori no?(se no che oop è?!)...
ma se disintegro la classe DB come routine interne ad autori perdo l'oop no?
la classe db sarà comune a molte altre classi (Libro,Prenotazione etc etc)
la nascondo al client come?
2) Problema
posto che autori abbia a disposizione il risultato della query (e siano ad
esempio 1000 record)
come li rendo disponibili al client....?
mi spiego...
NON voglio usare ADO sul client...
se no come nella mia app di test faccio ritornare il recordset ed è belle e
fatto!
perchè mi voglio complicare la vita?
primo per imparare...
secondo per esempio per fare usare l'app anche a pc vecchi o poco dotati!
mi sa che è impossibile facilmente eh!
anche se uso uno stream sempre ADO ci vuole...
un file XML? ma sempre ADO per interpretarlo no?
qunado passerò poi alla concorrenza vi romperò di nuovo le balls!
Intanto grazie a tutti coloro che mi hanno aiutato e aiuteranno su questo
per me terreno minato!

 NON voglio usare ADO sul client...
Leggo in fretta e quindi potrei darti una risposta -perlappunto-
"frettolosa"! ;-)
Se vuoi astrarre la comunicazione c/s da ADO non ti resta che crearti delle
classi consumer dei dati estratto con in cursori ADO che facciano il
wrapping degli stessi; non so se esistono wizard che ti facilitino la vita.
A grandi linee creati una classe che esponga le proprieta' che ti
interessano, mettici dentro alcuni metodi:
. readFromDb - per leggere i dati dal db e caricarli in una collection
privata (ti conviene avere una classe contenitore/consumer di dati e una
classe per il singolo "record" da istanziare e aggiungere come singolo
elemento sulla collection, magari associandola ad un indice significativo)
. alcune routine property get per presenatare i dati all'esterno (sulla
classe atomica)
. routine pubbliche per l'estrazione secondo i criteri che preferisci (per
posizione, per indice, eventualmente per restituire l'intera collezione o
sequenziandone gli elementi)
. ruotine property let/set o una routine unica con tanti parametri (o
entrambe, perche' no?) per il settaggio delle modifiche o dei nuovi
inserimenti (se l'applicativo e' un data entry)
. writeToDb - per ordinare lo scarico dei dati dalla memoria (le istanze di
classe) al database
. ecc. ecc.
E' un po' macchinoso ma la fatica e' amopiamente ripagata sia in termini di
robustezza, sia di manutenibilita', oltre che una soddisfazione
"professionale" nel riuscirci (ebbene si', anche con lo "sporco" VB si puo'
fare qlcosa di decente a livello di OOP!).....
Io ho seguito questa strada molte volte nella mia professione, ma purtroppo
i risultati sono un po' troppo corposi per essere portati come esempi; se
riesco (ed ho tempo e ....voglia! ;-) ) a trovare qlche esempio
piccolo/medio postabile sul sito comune, lo invio e ti/vi inforno qui (mi
segno la tua mail, ok?)....
Buon lavoro!                ...........aldo martini

Di solito non conviene che le tue functions restituiscano oggetti
recordset.
Potresti caricarti una matrice di Variant [ReDim
Matrix(mRs.Fields.Count,mRs.RecordCount)] che carichi opportunamente
dal server
scorrendoti da lģ il tuo bell'oggetto recordset, quindi passi la tua
matrice come ByRef...
Per il problema sull'OOP per nascondere la classe agli utenti, naviga
un
po' sull'MSDN in riferimento a quelle proprietą che compaiono quando
selezioni
il tuo modulo di Classe (Instancing, Persistable, ...).
Ciao !!!!
              Roby

 Ignoranza abissale sopra di me!
cut!
Grazie delle risposte...
:-)

 il tuo modulo di Classe (Instancing, Persistable, ...).
E qui c'e' davvero da divertirsi fingendo di essere dei veri programmatori
OOP ....
Bye.... aldo martini