Newsgroup: it.comp.lang.visual-basic
Titolo: [?] ADO e .recordcount uguale a -1

Ciao a tutti.
Di solito, accedevo ad un db solo in lettura e/o con un adodc perche'
dovevo fare poco piu' che delle stupidaggini.
Nei programmi che sto sviluppando, pero', mi capita di dover cambiare
spesso recordset perche' faccio molte query in sql e quindi volevo
lavorare direttamente "da codice" senza includere alcun controllo
particolare nei form dei vari progetti.
Quindi ho guardato nei soliti siti, ho scaricato qualche esempio, ho
modificato il codice, ho controllato in MSDN se tutto andava bene
--almeno sulla carta-- e poi ho scritto un po' di codice.
Che non funziona...
Provato col DSN su file di testo avevo il problema che il recordset
veniva creato correttamente ma .recordcount valeva -1, che e' un
dramma per quello che devo fare... Spulciando su MSDN vedo che:
***
La proprietą restituirą -1 se ADO non č in grado di determinare il
numero di record o se il provider o tipo di cursore non supporta
RecordCount. 
***
Ecco, mi era venuto il dubbio che col DSN su file di testo non ci
fosse modo a priori di sapere il numero di record --anche se mi
sembrava strano-- e allora mi sono collegato via lan a 2 server
differenti, su uno dei quali gira il PostgreSQL che utilizzero' con
l'applicazione definitiva e sull'altro gira un SQL Server 6.5, che non
upgradero' mai a 7.0 o successivi perche' tanto nemmeno uso quello...
Ecco, il problema che incontro e' che neppure verso questi database
riesco ad avere un .recordcount attendibile. Vale sempre -1... Siccome
da solo non riesco a cavarci i piedi, vi incollo il mio codice cosi'
magari qualcuno mi suggerisce in cosa sto sbagliando. Sono sicuro che
e' una cazzata, ma gli errori piccoli spesso sono quelli che si vedono
peggio :P
Ecco il codice:
***
Private Sub cmbSerie_Click()
Dim IstruzioneSQL As String
Dim DSN As String
Dim TipoDaCercare As String
Dim Conn1 As New ADODB.Connection
Dim Cmd1 As New ADODB.Command
Dim Rs1 As New ADODB.Recordset
    'azzero le combo dove scrivero' il risultato della query
    cmbPortata.Clear
    cmbSollevamento.Clear
 
    'voglio cercare le varianti della macchina su cui ho cliccato
    TipoDaCercare = cmbSerie.List(cmbSerie.ListIndex)
 
    'occhio agli ' per la stringa da cercare col WHERE!
    IstruzioneSQL = "SELECT portata_nominale,sollevamento_forche FROM
macchine_standard WHERE serie ='" & TipoDaCercare & "'"
    DSN = "DSN=PgIcem;UID=icem;PWD=;"
    'apro la connessione
    Conn1.ConnectionString = DSN
    Conn1.Open
 
    'imposto la query
    Set Cmd1.ActiveConnection = Conn1
    Cmd1.CommandText = IstruzioneSQL
 
    'apro il recordset
    Set Rs1 = Cmd1.Execute
 
    'se mi esce un altro -1 non rispondo delle mie azioni...
    MsgBox "Ho trovato " & Rs1.RecordCount & " record."
'usato in precedenza per alcune prove: da tagliare    
'    On Error Resume Next
'    With Rs1
'        Do While .EOF = False
'            cmbPortata.AddItem .fields(1).Value
'            cmbSollevamento.AddItem .fields(2).Value
'            .MoveNext
'        Loop
'    End With
 
    'piallo quel che non serve piu'
    Rs1.Close
    Conn1.Close
    Set Rs1 = Nothing
    Set Conn1 = Nothing
End Sub
-- 
      Gianni "bugbarbeq" Rondinini, 25, RA, 242, 152
  VBR - Vero Birro Romagnolo®, diffidate dalle imitazioni!
 Opel/ECC Calibrezio EVO-IV --- Kawasaki "Gas Gas" ZZ-R 1100
 ICQ# 36893168 - IRCNet: bugbarbeq, @ on #linux-it & #NetBSD


Prova a sostituire la riga sopra con rs1.Open (cmd1,conn1,1,1) (non ricordo
se è la sintassi giusta, devi comunque aprirlo NON forward-only per farti
restituire il numero di recordset, se non ricordo male)

devi aprire il recordset come adOpenKeyset oppure adOpenStatic...
bye
deV

devi aprire il recordset come adOpenKeyset oppure adOpenStatic...
Ringrazio entrambi: ho risolto.
E devo dire che e' sbalorditivamente veloce...
Stavo pensando se mi conveniva cercare di ottimizzare all'inverosimile
gli accessi al database, ma considerando che i tempi di latenza sono
praticamente nulli mi concentrero' prima su altre cose.
Saluti.
