none
Query RRS feed

  • Domanda

  • Buongiorno a tutti

    Sto impazzendo per fare delle query. Ho una form con una datagridview e una textbox. Vorrei fare una query che alla scrittura di un testo nella textbox mi fa la query. vorrei inoltre che mi cercasse le parole che iniziano con la parola che scrivo in modo che man mano che scrivo si fa la selezione.

    Nel codice textbox.textchanged ho scritto il seguente codice

                            try
                            {
                                this.anaclientiTableAdapter.FillByragsoc(this.dataSet1.Anaclienti, textBox2.Text);
                            }
                            catch (System.Exception ex)
                            {
                                System.Windows.Forms.MessageBox.Show(ex.Message);
                            }

    Ovviamente funziona, ma solo se tutto il testo nella datagridview è uguale ad un record.

    Come posso fare. Ho anche provato con alcuni esempi che diversi utenti hanno proposto ma mi sembrano troppo complicati.

    Grazie

    venerdì 17 marzo 2017 18:08

Risposte

  • Bene,

    se la tua ricerca avviene sempre per inizio stringa, ovvero se in TextBox2 l'utente digita sempre una stringa che deve essere cercata indipendentemente da come continua, potresti scrivere:

    this.anaclientiTableAdapter.FillByragsoc(this.dataSet1.Anaclienti, textBox2.Text + "%");

    In questo modo, quando verrà eseguito il Fill, ciò che è scritto in TextBox2.Text verrà concatenato al carattere %, e quindi opererà come previsto. L'utente non dovrà digitarlo, sarà aggiunto da programma solo in fase di recupero dati.


    Emiliano Musso // Microsoft MVP Visual Studio and Development Technologies

    • Contrassegnato come risposta Kadidar martedì 21 marzo 2017 13:05
    martedì 21 marzo 2017 12:37

Tutte le risposte

  • Buonasera Kadidar,
    devi usare LIKE nella query, in questo modo ad esempio se scrivi "pa" ti seleziona tutti i record che hanno all'interno parole con le lettere pa (tipo paolo).

    string query = "SELECT * FROM Tabella where tags like @tags";
    
    com.Parameters.AddWithValue("@tags", "%" + tag + "%");
    Ciao


    Paolo Pranzo

    venerdì 17 marzo 2017 18:16
  • Ciao

    Ti ringrazio per la risposta, ma non riesco a capire dove e come va inserito il like. Se provo ad inserirlo nella query creata in dataset mi indica che non riesce a leggere oppure quando mi dice che va tutto bene comunque non funziona

    chiedo scusa per l'insistenza ma sono inesperto e non ne vado a capo

    venerdì 17 marzo 2017 20:06

  • chiedo scusa per l'insistenza ma sono inesperto e non ne vado a capo

    Non c'è nessun problema, anzi, il forum esiste appositamente.
    Probabilmente, dato che hai scritto che la query restituisce il record correttamente solo quando il testo è uguale ad un record, la query è composta dalla condizione "=", (esempio WHERE campo=@parametro).
    Anziché la condizione di uguaglianza (il simbolo =) devi utilizzare il LIKE, proprio come la query che ti ho suggerito prima nella mia risposta precedente (WHERE campo like @parametro).

    Ciao


    Paolo Pranzo

    sabato 18 marzo 2017 15:02
  • Ciao

    Ti ringrazio per la pazienza. Purtroppo non funziona, continua non darmi dati fino a che non scrivo il parametro esattamente uguale al record.

    Non riesco a capirci niente.

    sabato 18 marzo 2017 16:11
  • Ciao Kadidar,

    hai possibilità di indicarci la query SELECT che hai nel DataSet, ed eventualmente il tipo che hai assegnato ai vari campi della tabella?



    Emiliano Musso // Microsoft MVP Visual Studio and Development Technologies

    lunedì 20 marzo 2017 11:15
  • Buongiorno

    V riporto una query che ho fatto. tutte le query che sono presenti sono fatte allo stesso medo ed infatti tutte non funzionano

    SELECT Avvertenza, C, CAS, CE, Candidate, Detergenti, GHS01, GHS02, GHS03, GHS04, GHS05, GHS06, GHS07, GHS08, GHS09, INCI, Id, [Index], Nome, Note, Peb, STEL, TWA, [Tvap-20], [mis-stel], [mis-twa] FROM Tabella31 WHERE (Nome LIKE @nome)

    Il dato "Nome" è un varchar(MAX).

    Grazie

    lunedì 20 marzo 2017 11:59
  • Il wizard del DataSet dovrebbe averti generato un metodo Fill, che accetta come primo parametro una DataTable, ma come eventuali parametri successivi le variabili che hai dichiarato nella SELECT.

    Se hai indicato la variabile @nome, il metodo Fill del tuo Adapter dovrebbe essere qualcosa del tipo:

    <adapter>.Fill(<datatable>, stringa)

    In fase di Fill, dovresti quindi avere la possibilità di indicare direttamente il filtro da utilizzare nella query.

    Ti risulta?



    Emiliano Musso // Microsoft MVP Visual Studio and Development Technologies


    lunedì 20 marzo 2017 13:05
  • Ciao

    Certamente. Come utilizzo questa informazione?

    Grazie

    lunedì 20 marzo 2017 13:17
  • Puoi passare al metodo Fill il parametro da utilizzare nella tua query.

    In pratica, se ho una query del tipo

    SELECT Codice, Descrizione FROM Tabella WHERE Codice LIKE @mioCodice

    Mi verrà generato un metodo in cui potrò indicare il valore di @mioCodice.
    Di conseguenza, se nel Fill scrivessi qualcosa del tipo:

    mioAdapter.Fill(miaDataTable, "prova")
    La query di cui sopra verrà eseguita come:
    SELECT Codice, Descrizione FROM Tabella WHERE Codice LIKE 'prova'
    Quindi ogni volta che il tuo parametro cambia, puoi eseguire il tuo metodo Fill passandogli i nuovi valori delle variabili esistenti nella clausola WHERE, per filtrare effettivamente per quei valori.



    Emiliano Musso // Microsoft MVP Visual Studio and Development Technologies

    lunedì 20 marzo 2017 13:33
  • Buongiorno

    Ti ringrazio, ma mi trova solamente i record che presentano il dato esattamente uguale al valore che inserisco e non quelli che iniziano con i valori che inserisco.

    lunedì 20 marzo 2017 14:14
  • Questo perché, utilizzando l'istruzione LIKE, è necessario utilizzare il carattere % per definire quelle parti di stringa che ti interessa ricercare, come accennava Paolo prima.

    Riassumendo, se non viene impiegato %, LIKE funziona come un normale confronto tra stringhe (LIKE 'prova' significa uguale a prova).

    Altrimenti, puoi definire i seguenti comportamenti:

    %prova
    Ricerca qualsiasi testo (nella colonna indicata) che termina con prova

    prova%
    Ricerca qualsiasi testo (nella colonna indicata) che inizia con prova

    pro%va
    Ricerca qualsiasi testo (nella colonna indicata) che inizia con pro, ha del testo intermedio qualunque, e termina con va.

    Il dato che passerai al tuo metodo Fill andrà allora adattato secondo lo schema di cui sopra: se, per esempio, volessi identificare tutto ciò che inizia per P, potresti scrivere:

    mioAdapter.Fill(miaDataTable, "P%")


    Emiliano Musso // Microsoft MVP Visual Studio and Development Technologies

    lunedì 20 marzo 2017 14:45
  • Buongiorno

    Non funziona. Se scrivo così mi da come errore "Nessun overload del metodo fillby accetta 2 argomenti. Io nella query del dataset inserisco WHERE Nome LIKE '@nome%'. In textbox2.textchanged ho inserito il codice

        try
                            {
                                this.anaclientiTableAdapter.FillByragsoc(this.dataSet1.Anaclienti, textBox2.Text);
                            }
                            catch (System.Exception ex)
                            {
                                System.Windows.Forms.MessageBox.Show(ex.Message);
                            }

    Cosa sbaglio?

    martedì 21 marzo 2017 09:15
  • Credo sia a causa del carattere % nella query, e degli apici.
    Il % fa parte del contenuto di una variabile (@nome), quindi non può essere indicato al suo fianco, perché deve essere - per così dire - "al suo interno". Gli apici, invece, denotano una stringa. Se li inserisci attorno al nome di un parametro, la query non cercherà di associare il contenuto della tua variabile a quel parametro, ma lo cercherà come stringa.

    In pratica, la tua query sta cercando fisicamente la stringa @nome% nel campo Nome.

    Infatti il wizard non riesce a crearti il Fill a due argomenti.
    Nella WHERE è giusto indicare il solo parametro @nome (quindi WHERE Nome LIKE @nome - niente % o apici), ed a questo punto ti verrà creato il Fill a due argomenti. L'eventuale % (e sempre niente apici) dovrà essere contenuto nel TextBox2.


    Emiliano Musso // Microsoft MVP Visual Studio and Development Technologies

    martedì 21 marzo 2017 09:31
  • Ho già risposto e fatto un esempio circa un anno or sono

    http://www.sabrinacosolo.com/come-eseguire-una-query-filtrata-su-sql-server-alla-modifica-del-testo-su-una-textbox/

    questo è l'articolo.

    Se il caso è diverso affina la richiesta

    saluti


    Sabrina C. - http://www.dotnetwork.it

    martedì 21 marzo 2017 09:41
  • Ciao Sabrina

    Avevo già provato la tua proposta ma non mi ha funzionato di sicuro perchè sapendo molto poco di c# non ho capito qualcosa.

    Per quanto riguarda Emiliano adesso inserendo % nella textbox funziona tutto. Direi che può andare bene così. Eventualmente ci sarebbe un modo per evitare di inserire sempre % nella textbox con i codici che ho inserito prima?

    Grazie

    martedì 21 marzo 2017 11:48
  • Bene,

    se la tua ricerca avviene sempre per inizio stringa, ovvero se in TextBox2 l'utente digita sempre una stringa che deve essere cercata indipendentemente da come continua, potresti scrivere:

    this.anaclientiTableAdapter.FillByragsoc(this.dataSet1.Anaclienti, textBox2.Text + "%");

    In questo modo, quando verrà eseguito il Fill, ciò che è scritto in TextBox2.Text verrà concatenato al carattere %, e quindi opererà come previsto. L'utente non dovrà digitarlo, sarà aggiunto da programma solo in fase di recupero dati.


    Emiliano Musso // Microsoft MVP Visual Studio and Development Technologies

    • Contrassegnato come risposta Kadidar martedì 21 marzo 2017 13:05
    martedì 21 marzo 2017 12:37
  • Ciao

    Funziona, finalmente sono riuscito a fare quello che volego.

    Grazie

    martedì 21 marzo 2017 13:05