Newsgroup: it.comp.lang.visual-basic
Titolo: MTS e Visual Basic

Ciao sono .Ho un problema con MTS.
Ho creato una classe che ricerca delle righe in una tabella:
----------------------------------------------------------------------------
-
Public Function ExeRicercaInUnaTabella (...vari parametri) as
ADODB.RecordSet
    '
    .... istruzioni per aprire la connessione
    '
    'istruzione per ricercare + righe attraverso una stored procedure
    'passando per un command
    '
    With cmd
        .CommandType = adCmdStoredProc
        .CommandText = "dbo.RicercaInUnaTabella"
        '
        'eccetera eccetera
        '
        .CommandTimeout = 10    '10 secondi prima del timeout
        '
        .ActiveConnection = cn
        '
    End With
    '
    '
    'crea il recordset lato server per far viaggiare meno roba possibile in
    'rete
    rs.CursorType = adOpenForwardOnly
    rs.CursorLocation = adUseServer
    rs.LockType = adLockReadOnly
    '
    '
    Set rs = cmd.Execute
    '
    Set ExeRicercaInUnaTabella = rs
    '
    '
    '
    '
    '
    '
    'segnala ad MTS che la transazione è completata
    '*** PUNTO CRITICO 1
    GetObjectContext.SetComplete
    '*** PUNTO CRITICO 2
    '
    '
    '
    'Gestione degli errori, eccetera, eccetera
----------------------------------------------------------------------------
-
Quando provo il mio client in VB richiamando la classe:
 - Se devo recuperare recordset piccoli funziona tutto benissimo
 - Se devo recuperare recordset + consistenti (circa 400 righe,
   ogni riga è composta da 6 campi) si impianta. Su MTS l'icona a
   forma di palla della classe continua a girare, il client è bloccato
   e se cerco di interrompere l'esecuzione mi dice:
  Component Request Pending.
  This action cannot be completed because the other application
  is busy. Choose 'Switch To' to activate the busy application
  and correct the problem.
   Non mi resta che resettare.
   Debbuggando la mia classe sono arrivato al punto di capire che si
   blocca dove ti ho messo il commento *** PUNTO CRITICO 1, ovvero il
   comando GetObjectContext.SetComplete lo impianta. Al commento
   *** PUNTO CRITICO 2 non ci arriva mai.
   Perchè ?
   Come si fa a recuperare recordset grossi ?
   Puoi farmi un esempio con del codice ?
Il codice del mio client è il seguente
----------------------------------------------------------------------------
-
    '
    '
    Dim rs As ADODB.Recordset
    Dim myobj As RicercaTabelle.RicercaInUnaTabella
    '
    Set myobj = CreateObject("RicercaTabelle.RicercaInUnaTabella")
    '
    Set rs = Nothing
    '
    'recupera il recordset
    Set rs = myobj.ExeRicercaInUnaTabella(... vari parametri)
    '
    Dim icount As Integer
    '
    '
    While Not rs.EOF
        '
        'passa alla prossima riga
        rs.MoveNext
        '
        icount = icount + 1
        '
    Wend
    '
    '
    MsgBox icount
    '
    '
    Set myobj = Nothing
    '
    '
----------------------------------------------------------------------------
-
--
----------------------------------------------------------------
C.S.N. INFORMATICA s.a.s.
Corso Milano 8
28100 NOVARA
#032131386
#0321611534
fax #0321631266
www.csn.it
ca...@tin.it


credo che il problema potrebbe essere originato da qui:
prova a commutare la riga di codice in:
Dim objCtx As ObjectContext
Set objCtx = GetObjectContext()
Set myobj = objCtx.CreateInstance("RicercaTabelle.RicercaInUnaTabella")
ecc. ecc.
ciao, hal

     rs.LockType = adLockReadOnly
    guarda che per quello che dici serve lato client!!!!!!!

prova a cambiare il client come ti ho detto..
inoltre quella chiamata è in stile COM+, su MTS non credo funzioni chiamando
direttamente getobjectcontext, ma mi sembra sia necessario istanziare prima
un oggetto contesto..
inoltre che te ne fai di una transazione di lettura?
