none
VB2012-Una select sql con i dati di una listbox RRS feed

  • Domanda

  • Ciao a tutti,

    vorrei creare un filtro tramite select sql con i dati di una listbox (multiselection) scelti dall'utente . Prima cosa la listbox è in un'altra form, richiamata da quella che avrà poi il pulsante filtro. Quindi pensavo di mettere le selezioni dell'utente da listbox ad array. Una volta chiusa la form di selezione dati della list, tornare nella form principale e alla pressione di un tasto "filtra" fare una select con i dati dell'array . Come fare ad impostare la select (clausola list ? ) e l'idea di mettere le selezioni in un array è valida oppure c'è un metodo migliore ?

    Grazie a tutti

    mercoledì 20 novembre 2013 16:01

Risposte

  • Ciao,

    partendo dalla SELECT, puoi appoggiarti alla clausola IN. Supponendo di avere da un'ipotetica tabella "articoli" la necessità di estrarre i codici 001, 002 e 003, puoi scrivere:

    SELECT * FROM articoli WHERE codice IN ('001', '002', '003')

    Lato VB, per ottenere da una List la tua stringa di selezione, potresti appoggiarti alla funzione Join del tipo String. Per esempio, questo scorcio di codice:

    Dim lista As New List(Of String)
    lista.Add("001")
    lista.Add("002")
    
    Dim filtro As String = String.Join(",", From s In lista Select Chr(39) & s & Chr(39))

    produrrà la stringa '001', '002', che potrai utilizzare nella tua SELECT.

    Spero di esserti stato di aiuto.


    Emiliano Musso

    • Proposto come risposta Irina Turcu venerdì 22 novembre 2013 11:19
    • Contrassegnato come risposta Irina Turcu lunedì 25 novembre 2013 15:56
    mercoledì 20 novembre 2013 16:12
    Moderatore

Tutte le risposte

  • Ciao,

    partendo dalla SELECT, puoi appoggiarti alla clausola IN. Supponendo di avere da un'ipotetica tabella "articoli" la necessità di estrarre i codici 001, 002 e 003, puoi scrivere:

    SELECT * FROM articoli WHERE codice IN ('001', '002', '003')

    Lato VB, per ottenere da una List la tua stringa di selezione, potresti appoggiarti alla funzione Join del tipo String. Per esempio, questo scorcio di codice:

    Dim lista As New List(Of String)
    lista.Add("001")
    lista.Add("002")
    
    Dim filtro As String = String.Join(",", From s In lista Select Chr(39) & s & Chr(39))

    produrrà la stringa '001', '002', che potrai utilizzare nella tua SELECT.

    Spero di esserti stato di aiuto.


    Emiliano Musso

    • Proposto come risposta Irina Turcu venerdì 22 novembre 2013 11:19
    • Contrassegnato come risposta Irina Turcu lunedì 25 novembre 2013 15:56
    mercoledì 20 novembre 2013 16:12
    Moderatore
  • Ciao Emiliano,

    grazie innanzitutto, quindi basterà poi inserire nella select sql  :

    SELECT * FROM articoli WHERE codice IN filtro

    corretto ?

    ancora grazie

    mercoledì 20 novembre 2013 16:52
  • Si, diciamo che potresti avere la tua variabile query compilata come segue:

    Dim query as String = "SELECT * FROM articoli WHERE codice IN (" & filtro & ")"

    Il codice sarebbe poi da perfezionare per evitare attacchi di tipo SQL Injection da parte di chi imputa i dati, ma il senso è questo.


    Emiliano Musso

    mercoledì 20 novembre 2013 16:54
    Moderatore
  • Ciao , grazie ancora. Riesci a darmi una mano su un'altra cosuccia : 

    Ho scoperto che in una listbox associata ai dati bisogna usare la datarowiev, siccome devo prendere tutti i valori selezionati in una listbox e metterli in una matrice, con il seguente codice :

            Dim lista As New List(Of String)
            Dim lst_row As DataRowView = ListBox1.SelectedItem
    
            For Each list_row In ListBox1.SelectedItems
                'Seleziona tutti gli elementi
                lista.Add(lst_row("org_acquisti").ToString)
            Next
     
        End Sub
    

    anche se seleziono 3 valori nella matrice mi inserisce 3 volte il primo che trova , come se leggesse solo quello.

    Dove sbaglio ?

    Grazie mille

    giovedì 21 novembre 2013 13:21
  • scusa, risolto con :

            For Each list_row In ListBox1.SelectedItems
                'Seleziona tutti gli elementi
                'ListBox1.SetSelected(i, True)
                lst_row = ListBox1.SelectedItems(i)
                lista.Add(lst_row("org_acquisti").ToString)
                i = i + 1
     Next

    se c'è un metodo migliore, son qui ... :-)

    grazie

    giovedì 21 novembre 2013 13:50
  • Se hai un ListBox dal quale attingere per valorizzare le Rows di una DataTable, ti consiglierei di valutare qualcosa di questo tipo:

    ' -- ListBox1 con possibilità di scelta multipla
    ListBox1.SelectionMode = SelectionMode.MultiSimple
    
    ' -- Creazione di una struttura DataTable, dichiarando la colonna "org_acquisti"
    Dim dt As New DataTable()
    dt.Columns.Add("org_acquisti")
    
    ' -- Loop sugli elementi selezionati in ListBox1, aggiunta di ogni elemento come Row del DataTable
    For Each l As String In ListBox1.SelectedItems
       dt.Rows.Add(l)
    Next
    
    ' -- Loop sulle Rows del DataTable, esponendo il valore del dato
    For Each r As DataRow In dt.Rows
       MsgBox(r.Item(0))
    Next

    Dopo aver selezionato dalla ListBox gli Items desiderati, non è utile trasferirli in una List e quindi elaborarla per andare ancora su una terza struttura: basta definire la nostra DataTable, e popolarla direttamente con gli elementi selezionati in ListBox.

    Spero queste note ti siano di aiuto.


    Emiliano Musso

    giovedì 21 novembre 2013 13:57
    Moderatore