+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 10 su 10

ricerca con adodc in textbox

  1. #1
    anna non è in linea Novello
    Premetto che non ho molta dimistichezza con VB6, ma mi diletto a fare piccoli progetti.
    Dovendo eseguire una ricerca direttamente in una texabox digito il seguente codice:

    Private Sub Text1_Change()

    Dim db As Connection
    Set db = New Connection
    db.CursorLocation = adUseClient

    db.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Mydatabase.mdb;"

    Set adoPrimaryRS = New Recordset

    adoPrimaryRS.Open "select * from Tabella1 where nome like '%" & Text1.Text & "%'", db, adOpenStatic, adLockOptimistic

    Set Text2.DataSource = adoPrimaryRS
    Set Text3.DataSource = adoPrimaryRS
    Set DataGrid1.DataSource = adoPrimaryRS

    mbDataChanged = False

    End Sub

    Se non considero le stringhe evidenziate in rosso funziona benissimo, altrimenti succede che dopo pochi tentativi di ricerca, il progetto va in errore.

    Mi date un aiuto a trovare la soluzione per far dialogare datagrid e textbox insieme.

    A presto

    Saluti a tutti

  2. #2
    L'avatar di yronium
    yronium non è in linea Scribacchino
    Ciao. Ci sono numerosi errori, ma prima di tutto vorrei iniziare pregandoti di racchiudere il codice tra gli appositi tag [code] e [/code], perchè altrimenti diventa difficile per noi leggerlo.

    Inoltre, è perfettamente inutile che tu ci dica che il tuo codice "va in errore" se non ci dici quale errore si manifesta, su che riga del codice, e in quali condizioni si trova l'applicazione. E dovresti anche descriverci ciò che vorresti fare, perché forse c'è una strada migliore. Insomma, se vuoi aiuto da parte nostra ci devi fornire maggiori indicazioni possibili. Quando hai tempo leggi questo interessante articolo, che contiene un sacco di utilissimi consigli per postare le richieste in modo da ottenere velocemente delle risposte efficaci.

    Infine, in attesa di saperne un po' di più, faccio soltanto qualche osservazione:
    1. non credo che abbia senso impostare la proprietà DataSource di due textbox se poi non assegni loro anche un campo di riferimento nella proprietà DataField (v. Guida);
    2. il metodo Open di un oggetto Recordset è più efficiente se ne imposti anche l'ultimo argomento. In questo caso dovresti aggiungere adCmdText per specificare che la query è in forma di testo, altrimenti ADO deve scoprirlo da solo perdendo del tempo (comunque, in queste condizioni, è come gettare un secchio d'acqua sulla California in fiamme...);
    3. hai verificato dentro Access che la query che stai tentando di passare restituisca effettivamente dei record, che sia valida, che sia scritta correttamente, che non contenga errori?

    Ci sono migliaia di post che spiegano queste cose, soltanto nel nostro forum ce ne sono decine. Se ti dai la pena di fare una ricerca (con l'istruzione Cerca: qui sopra, in alto a destra) puoi trovare molti esempi di utilizzo di ADO, connessioni, recordset, controlli data-bound (che ti sconsiglio), sintassi e tecniche di programmazione. E per quanto riguarda il tuo errore specifico, se non ci dici qualcos'altro non possiamo andare avanti.


    Restiamo in trepidante attesa...


    PS: il link qui sopra per l'articolo delle Domande Intelligenti non è quello solito che uso io (per intendersi, quello col "florbish") perché sembra che oggi quest'ultimo funzioni a singhiozzo. Quest'altro è stato tradotto evitando molte frasi spiritose ed ironiche, anche se il senso della traduzione è lo stesso.
    ℹ️ Leggi di più su yronium ...

  3. #3
    anna non è in linea Novello
    Nelle proprietà datafied delle textbox 1 e 2 avevo già impostati i nomi dei campi.

    Dopo pochi tentativi di ricerca dati (non immediatamente) si verifica il seguente errore:

    errore di run time '-2147467259 (80004005)

    Errore non specificato

    Debug (evidenziato in giallo):

    db.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\mimmo\database2.mdb;"

    Preciso che questo mi capita solo se ho configurato le textbox 1 e 2.

    Dove sbaglio. forse devo chiudere la connessione, ma come.

    Saluti

  4. #4
    L'avatar di spikexx84
    spikexx84 non è in linea Scribacchino
    Quote Originariamente inviato da anna Visualizza il messaggio
    Nelle proprietà datafied delle textbox 1 e 2 avevo già impostati i nomi dei campi.

    Dopo pochi tentativi di ricerca dati (non immediatamente) si verifica il seguente errore:

    errore di run time '-2147467259 (80004005)

    Errore non specificato

    Debug (evidenziato in giallo):

    db.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=C:\mimmo\database2.mdb;"

    Preciso che questo mi capita solo se ho configurato le textbox 1 e 2.

    Dove sbaglio. forse devo chiudere la connessione, ma come.

    Saluti
    Ciao, non sò se il problema può davvero essere questo, ma se non sai chiudere una connessione e un recordset sinceramente di consiglierei di studiare un pochettino prima di andare avanti, perchè queste sono decisamente le basi.

    Comunque giusto per non essere solo il solito rompi scatole ti posto un esempio completo e commentato che include due modi per aprire una connessione e un recordset (uno passaggio per passagio l'altro diretto) e la loro chiusura finale.

        'Dichiaro record e connessione
        Dim cn As ADODB.Connection
        Dim rs As ADODB.Recordset
     
        'Inizializzo record e connessione
        Set cn = New ADODB.Connection
        Set rs = New ADODB.Recordset
     
        'Imposto il tipo di cursore (dal momento che si tratta di un db access dubito tu debba farlo lavorare Server/Side)
        cn.CursorLocation = adUseClient
     
        'Apertura connessione n° 1, ottima per i principianti perchè si capisce cosa si sta facendo
            'Imposto il provider OleDb.4.0 e l'engine Jet per i database di tipo mdb (creati da access per capirci)
            cn.Provider = "Microsoft.Jet.OleDb.4.0"
            'Imposto il data source (il percorso fisico del db)
            cn.Properties("Data Source") = "C:\db1.mdb"
            'Apro la connessione
            cn.Open
     
        'Apertura connessione n° 2 tramite stringa di connessione più immediata (risparmio due righe di codice su tre)
            'cn.Open "Microsoft.Jet.OleDb.4.0;Data Source=C:\db1.mdb"
     
        'Apertura recordset n° 1, ottima per i principianti perchè si capisce cosa si sta facendo (anche se non si possono impostare le opzioni)
            'Assegno la connessione con la quale il recordset deve lavorare
            Set rs.ActiveConnection = cn
            'Imposto la sorgente di dati
            rs.Source = "Select Campo From Tabella"
            'Imposto il tipo di cursore che può scorrere solo in avanti
            rs.CursorType = adOpenForwardOnly
            'Imposto il blocco del record su sola lettura
            rs.LockType = adLockReadOnly
            'Apro il recordset
            rs.Open
     
        'Apertura recordset n° 2, direttamente dal metodo Open, più diretta e con la possibilità di impostare anche le opzioni
            'rs.Open "Select Campo From Tabella", cn, adOpenForwardOnly, adLockReadOnly, adCmdTable
     
        'Chiusura recordset
        rs.Close
        'Annientamento recrodset
        Set rs = Nothing
        'Chiusura connesione
        cn.Close
        'Annientamento connessione
        Set cn = Nothing
    
    ℹ️ Leggi di più su spikexx84 ...

  5. #5
    anna non è in linea Novello
    Innanzitutto vi ringrazio per i vostri preziosi suggerimenti.


    In riferimento all'oggetto, mi si presenta un altro problema.
    Nella casella di testo dove effettuo la ricerca, se digito il segno apice (') mi restituisce il seguente errore:

    Errore di sintassi nell'espressione della query 'campo like '%'%".

    Al debug mi compare evidenziato in giallo:

    adoPrimaryRS.Open "select * from tabella1 where nome like '%" & Text1.Text & "%'", db, adOpenStatic, adLockOptimistic, adCmdText

    Come dovrei fare se dovessi ricercare testo apostrofato...

    Saluti a tutti

  6. #6
    L'avatar di yronium
    yronium non è in linea Scribacchino
    Anzitutto ti suggerisco di costruirti la query a parte, in una variabile stringa separata. Poi passa questa variabile al metodo Open. In questo modo puoi interrompere l'esecuzione del codice e controllare il valore della variabile (ed eventualmente, correggerla) prima di tentare effettivamente l'apertura del recordset.


    Quote Originariamente inviato da anna Visualizza il messaggio
    Come dovrei fare se dovessi ricercare testo apostrofato...
    E' un problema comune, stra-trattato (anche nei post che avresti trovato facendo la ricerca che ti ho suggerito). Il suggerimento che va per la maggiore è di raddoppiare gli apici nella query di ricerca.
    Io invece di solito consiglio di sostituirli con l'istruzione Chr(39), come segue:
    Dim sql As String
    sql = "SELECT * FROM tabella1 WHERE nome LIKE " & Chr(39) & "%" & Text1.Text & "%" & Chr(39)
    adoPrimaryRS.Open sql, db, adOpenStatic, adLockOptimistic, adCmdText
    
    Spero sia utile. Ciao.
    ℹ️ Leggi di più su yronium ...

  7. #7
    anna non è in linea Novello
    Utilissimo.

    Funziona una meraviglia.

    Adesso vorrei tentare di estendere la query applicando un ulteriore text di ricerca (text2):

    sql = "SELECT * FROM tabella1 WHERE nome LIKE " & Chr(39) & "%" & Text1.Text & "%" & Chr(39) AND cognome LIKE " & Chr(39) & "%" & Text2.Text & "%" & Chr(39)


    purtroppo l'impostazione della strinda sopra elencata va automaticamente in errore...

    Come posso fare

    Saluti a tutti

  8. #8
    L'avatar di yronium
    yronium non è in linea Scribacchino
    sql = "SELECT * FROM tabella1 WHERE nome LIKE " & Chr(39) & "%" & Text1.Text & "%" & Chr(39) & " AND cognome LIKE " & Chr(39) & "%" & Text2.Text & "%" & Chr(39)
    
    Ora è giusta.
    ℹ️ Leggi di più su yronium ...

  9. #9
    anna non è in linea Novello
    Ho provato a impostare il seguente codice:

    sql = "SELECT * FROM tabella1 WHERE nome LIKE " & Chr(39) & "%" & TextBox1.Text & "%" & Chr(39) & " and età between " & TextBox2.Text & " and " & TextBox3.Text & ""

    Grazie ai Vs suggerimenti, la ricerca per parametri funziona benissimo.

    Però, ho notato che se lascio invariato l'intervallo età (text2 e text3) ed effettuo una ricerca solo per nome, si presenta il seguente errore:

    Errore di sintassi (operatore mancante) nell'espressione della query 'nome Like "%Tizio%" and età between and'.


    C'è un modo per ovviare anche a questo...

    Salutissimi...

  10. #10
    L'avatar di yronium
    yronium non è in linea Scribacchino
    Quote Originariamente inviato da anna Visualizza il messaggio
    Errore di sintassi (operatore mancante) nell'espressione della query 'nome Like "%Tizio%" and età between and'.

    C'è un modo per ovviare anche a questo
    Ce n'è più di uno: ti puoi costruire una query parametrica, puoi usare gli oggetti ADO Command e Parameter, o puoi costruirti due diverse query e passarne l'una o l'altra tramite un blocco If-ElseIf. Addirittura, visto che stai lavorando su un database Access, potresti perfino crearti diverse query Access e richiamarne l'una o l'altra a seconda dei casi.

    Secondo me la terza via è quella maggiormente alla tua portata. Il pezzetto della query risultante nell'errore che ricevi dice ".... and età between and...", cioè non c'è alcun dato dopo la parola chiave BETWEEN. In pratica, la prima data è vuota. Questo è uno dei casi che può verificarsi nel tuo codice. Perciò puoi costruirti un blocco If che a seconda della situazione costruisca una diversa query:
    --- Pseudocodice ---
    If le date ci sono entrambe Then
        sql = "SELECT ..... BETWEEN ...."
    ElseIf manca la prima data Then
        sql = "SELECT ..... fino_alla_data...."
    ElseIf manca la seconda data Then
        sql = "SELECT ..... dopo_la_data...."
    ElseIf mancano entrambe le date Then
        sql = "SELECT ..... altra_condizione...."
    End If
    
    Questa tecnica è un po' laboriosa perché devi buttare giù tante query quante sono le condizioni che possono verificarsi, ma è il meccanismo più semplice da progettare e più veloce come prestazioni. Le altre tecniche richiedono da parte tua una buona conoscenza del funzionamento di ADO, e se hai queste difficoltà sulle query non credo che riusciresti a comprenderle e ad implementarle. Quando però avrai compreso a fondo il funzionamento di ADO vedrai che gli oggetti Parameter, sebbene complessi da comprendere, sono i più versatili e semplici da implementare.

    Spero sia utile. Ciao.
    ℹ️ Leggi di più su yronium ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Ricerca in FlexGrid con TextBox
    Da pierovb nel forum Visual Basic 6
    Risposte: 4
    Ultimo Post: 25-04-2014, 09:39
  2. [VB6]: Ricerca all'interno di una FlexGrid con textbox...
    Da maninblack nel forum Visual Basic 6
    Risposte: 9
    Ultimo Post: 04-11-2012, 18:14
  3. Ricerca su database con textbox
    Da LeggenDario nel forum Visual Basic .Net
    Risposte: 5
    Ultimo Post: 28-08-2011, 12:06
  4. Ricerca tramite textbox VBA
    Da marcod nel forum Microsoft Word
    Risposte: 4
    Ultimo Post: 21-04-2011, 21:01
  5. Ricerca da TextBox in DataGrid
    Da dade_n nel forum Visual Basic 6
    Risposte: 1
    Ultimo Post: 21-02-2009, 17:53