+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 3 su 3

Discussione: [ADO] aiuto con visualizzazione su controllo griglia

  1. #1
    Badthing non è in linea Scolaretto
    Post
    111

    [ADO] aiuto con visualizzazione su controllo griglia

    Salve a tutti,

    è da poco che stò imparando ADO e dopo aver letto e studiato i metodi, le proprietà e gli eventi dei suoi oggetti principali, ho fatto un piccolo programma di prova composto da un form con un controllo Hierarchical FlexGrid 6.0 ed un semplice pulsante di comando.

    Questo il codice del form_load

    codice:
    Dim rs As ADODB.Recordset
     
    Set cn = New ADODB.Connection 'variabile a livello di modulo
    cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=E:\Documenti\adotutor\AdoTutor.mdb"
    cn.Open
    Set rs = New ADODB.Recordset
    With rs
        .Source = "Select * from Tabella1"
        .CursorLocation = adUseClient
        .CursorType = adOpenStatic
    End With
    rs.Open , cn
    set grid_control.DataSource = rs
    Tutti i dati richiesti vengono caricati nella griglia, e fin qui tutto va bene.
    Poi nel codice del pulsante vorrei eseguire una semplice query utilizzando l'oggetto command

    codice:
    Dim cmd As New ADODB.Command
    Dim rs As New ADODB.Recordset
     
    With cmd
        .CommandText = "Select * from Tabella2"
        .CommandType = adCmdText
        .ActiveConnection = cn
    End With
    rs.Open cmd
    Set grid_control.DataSource = rs
    La tabella viene popolata con solo un record e non capisco perchè.

    Provo con il comando Set rs = cmd.execute ma nella griglia c'è sempre un solo record.

    Provo anche il comando Set rs = cmd.execute ma ottengo l'errore 'il controllo FlexGrid non supporta il tipo di associazione di dati necessario'.

    Infine sostituisco la FlexGrid con un DataGrid ma con scarso successo, ottenendo altri tipi di errori.

    Qualcuno potrebbe cortesemente aiutarmi?
    Grazie a tutti per l'attenzione.

  2. #2
    Luogo
    Lazio
    Post
    1,702
    Blogs
    21
    Quote Originariamente inviato da Badthing
    Salve a tutti,

    ....................

    Questo il codice del form_load

    codice:
    Dim rs As ADODB.Recordset
     
    Set cn = New ADODB.Connection 'variabile a livello di modulo
    cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=E:\Documenti\adotutor\AdoTutor.mdb"
    cn.Open
    Set rs = New ADODB.Recordset
    With rs
        .Source = "Select * from Tabella1"
        .CursorLocation = adUseClient
        .CursorType = adOpenStatic
    End With
    rs.Open , cn
    set grid_control.DataSource = rs
    Tutti i dati richiesti vengono caricati nella griglia, e fin qui tutto va bene.
    Poi nel codice del pulsante vorrei eseguire una semplice query utilizzando l'oggetto command

    codice:
    Dim cmd As New ADODB.Command
    Dim rs As New ADODB.Recordset
     
    With cmd
        .CommandText = "Select * from Tabella2"
        .CommandType = adCmdText
        .ActiveConnection = cn
    End With
    rs.Open cmd
    Set grid_control.DataSource = rs
    La tabella viene popolata con solo un record e non capisco perchè.

    Provo con il comando Set rs = cmd.execute ma nella griglia c'è sempre un solo record.

    Provo anche il comando Set rs = cmd.execute ma ottengo l'errore 'il controllo FlexGrid non supporta il tipo di associazione di dati necessario'.

    Infine sostituisco la FlexGrid con un DataGrid ma con scarso successo, ottenendo altri tipi di errori.

    Qualcuno potrebbe cortesemente aiutarmi?
    Grazie a tutti per l'attenzione.
    Ciao,

    il motivo dello strano comportamento è da attribuirsi al tipo di cursore ritornato
    (CursorType ed anche CursorLocation credo),alle varie modalità di apertura
    e suppongo anche al tipo di database e al particolare controllo usato.

    Nel caso del cmd hai un cursore 'solo avanti' (adOpenForwardOnly)
    che non si può 'scorrere' avanti ed indietro come una griglia richiederebbe
    per cui , per qualche strano motivo a me sconosciuto, ti fa vedere solo la prima
    riga invece di darti errore come invece mi sarei aspettato (ma non mi meraviglierebbe neanche se funzionasse con un altro tipo di griglia tipo la TrueDbGrid)

    ... insomma, che io sappia, quello che succede in realtà dipende da tanti fattori e tieni conto anche che, in generale, le caratteristiche del cursore (ed anche della connessione) dopo l'apertura possono essere diverse da quelle da te impostate
    in precedenza (sempre che io sappia mamma M$ ha pensato bene di cambiarle a nostra insaputa nel caso fossero 'sbagliate' o 'incongruenti' per cercare di 'darci quanto richiesto')

    ...se vuoi far funzionare il tuo esempio con il cmd
    (ma non credo che funzioni anche con il set rs=cmd.execute che dovrebbe tornarti *sempre* un cursore adOPenForwardOnly) puoi provare così :

    codice:
    Private Sub Command2_Click()
     
    cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=E:\Documenti\adotutor\AdoTutor.mdb"
    
    cn.Open
    
    Set rs = New ADODB.Recordset
    
    '>>>N.B. imposto un  tipo di cursore compatibile con la griglia
    With rs
        .CursorLocation = adUseClient
        .CursorType = adOpenStatic
        .LockType = adLockReadeOnly
    End With
    
    With cmd
         .ActiveConnection = cn
        .CommandText = "Select * from Tabella2"
        .CommandType = adCmdText
    End With
    
    rs.Open cmd
    
    Debug.Print "rs.CursorLocation = adUseClient ?"; (rs.CursorLocation = adUseClient)
    Debug.Print "rs.CursorType = adOpenForwardOnly?"; rs.CursorType = adOpenForwardOnly
    
    Set MSHFlexGrid2.DataSource = rs
    
    End Sub
    ... sperimenta e facci sapere

    P.S.

    dichiarare le istanze in questo modo :
    dim rs as new adodb.recordset
    in genere non è una buona pratica di programmazione
    perchè il compilatore aggiunge il codice necessario a creare il recordset
    ogni qualvolta esso sia usato pur essendo a nothing;

    se non hai buoni motivi per farlo ti conviene fare :

    dim rs as adodb.recordset
    ... quando ti serve il recordset
    set rs = new adodb.recordset
    Ultima modifica di sspintux; 08-06-2006 23:13 
    Ciao sspintux
    ------------------------------------------------------------

    O Santo Protettore dell'informatico quadratico medio, se puoi allontana da me questo cetriolo amaro!
    Azz! ... questo è un grande porck-around; potremmo addirittura farlo passare per una funzionalità avanzata

  3. #3
    Badthing non è in linea Scolaretto
    Post
    111
    Quote Originariamente inviato da sspintux

    ... sperimenta e facci sapere
    Ciao e grazie veramente per l'interessamento. Il problema l'ho risolto grazie al tuo consiglio. Impostando correttamente CursorType e CursorLocation la griglia viene popolata correttamente.

    Grazie di tutto.

    Ciao

+ Rispondi al Thread

Discussioni simili

  1. Associare controllo image a MMControl
    Da Cis nel forum Visual Basic 6
    Risposte: 3
    Ultimo Post: 13-06-2006, 06:40
  2. Aumento di grandezza controllo Image
    Da Cis nel forum Visual Basic 6
    Risposte: 7
    Ultimo Post: 20-05-2006, 15:08
  3. Articolo: Le Common Dialog Box
    Da freezer nel forum Visual Basic 6
    Risposte: 0
    Ultimo Post: 18-11-2005, 09:45
  4. Articolo: [Componenti ActiveX] Realizzare una ProgressBar
    Da TheTruster nel forum Visual Basic 6
    Risposte: 0
    Ultimo Post: 07-11-2005, 14:30
  5. [VB6] Visualizzazione record su DataGrid
    Da mavy nel forum Visual Basic 6
    Risposte: 2
    Ultimo Post: 29-10-2005, 23:58

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi