Newsgroup: it.comp.lang.visual-basic
Titolo: Popolare caselle combinate

Ciao,
sto sviluppando un progetto con Visual Studio 2010 dove ho 3 caselle combinate (cbMacina, cbSegmento e cbRicetta)
 
Mi connetto alla tabella server:
 
Private Sub CreaTabelle(ByVal NomeTab As String, ByVal Query As String, ByVal Combo As ComboBox)
 
        Dim cn As New OdbcConnection("DRIVER=SQL Server;SERVER=ServerName;Uid=***;Pwd=*****;DATABASE=dbName;")
        cn.Open()
 
        Dim command As New OdbcCommand(Query, cn)
        Dim da As New OdbcDataAdapter
 
        da.SelectCommand = command
 
        Dim ds As New DataSet(NomeTab)
        ds.Clear()
 
        da.Fill(ds, NomeTab)
 
        Combo.DataSource = ds.Tables(NomeTab).DefaultView
 
    End Sub
 
Popolo la cbMacina
 
'Popolo la Combo Macina
        CreaTabelle("T_Regolazioni", "Select Distinct Macina From T_Regolazioni order by Macina", cbMacina)
        cbMacina.DisplayMember = "Macina"
        cbMacina.Text = ""
 
Popolo la cbSegmento prendendo il dato da cbMacina
 
'Popolo la Combo Segmento
        CreaTabelle("T_Regolazioni", "Select Distinct Segmento, Macina From T_Regolazioni Where Macina=" & cbMacina.Text & "", cbSegmento)
        cbSegmento.DisplayMember = "Segmento"
        cbSegmento.Text = ""
 
ora dovrei popolare la cbRicetta prendendo i dati sia da cbMacina che da cbSegmento ma non funziona rendendomi un "Invalid column name (nome dell'item selezionato) in cbSegmento!!
 
'Popolo la Combo Ricetta
        'CreaTabelle("T_Regolazioni", "Select Ricetta, Macina, Segmento From T_Regolazioni Where Macina=" & cbMacina.Text & "And Segmento=" & cbSegmento.Text & "", cbRicetta)
        cbRicetta.DisplayMember = "Ricetta"
        cbRicetta.Text = ""
 
Ho provato a popolare la cbRicetta dalla sola cbMacina e funziona mentre dalla sola cbSegmento va in errore, cosa cambia?
grazie
Marco
 

         cbRicetta.Text = ""
 
Così a occhio, hai un problema nella composizione del comando SQL... se "Macina" e "Segmento" sono colonne definite VARCHAR nel database, il modo con cui concateni i parametri dopo "=" può creare ambiguità, perchè il motore non sa se deve interpretare il valore comne letterale o come riferimento ad un altro oggetto nel database.
Questo in particolare se il valore del combo in quel momento contiene caratteri particolari (.,% ecc.) o per caso parole chiave del dialetto SQL
 
Per farla breve: i comandi SQL che indirizzano colonne testo, devono usare il delimitatore '
 
"... where Macina='aaaa' and Segmento='bbbb' ..."
 
Nota che devi considerare anche il caso in cui il valore stesso contenga uno o più apici singoli, e nel caso raddoppiarli, per creare la sequenza di escape corretta... un grande classico che più o meno tutti hanno da parte nel taschino per queste cose, è una funzioncina tipo
 
Public Function DBText(ByVal inputValue as String) As String
    If inputValue.Contains("'") Then
        inputValue = inputValue.Replace("'","''")
    End If
    Return String.Format("'{0}', inputValue)
End Function 
 
Da usare con 
 
Where Macina=" & DBText(cbMacina.Text) & "And Segmento=" & DBText(cbSegmento.Text)


Ciao,
ho provato la tua funzione ed ora nella combo Ricetta mi rende System.Data.DataRowView:
 
Nella function ho aggiunto " dopo 0}' perchè mi dava errore
 
Public Function DBText(ByVal inputValue As String) As String
        If inputValue.Contains("'") Then
            inputValue = inputValue.Replace("'", "''")
        End If
        Return String.Format("'{0}'", inputValue)
 
    End Function
 
Private Sub cbRicetta_DropDown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbRicetta.DropDown
 
CreaTabelle("T_Regolazioni", "Select Ricetta, Macina, Segmento From T_Regolazioni Where Macina=" & DBText(cbMacina.Text) & "And Segmento=" & DBText(cbSegmento.Text) & "", cbRicetta)
 
End sub
 

 ho provato la tua funzione ed ora nella combo Ricetta mi rende System.Data.DataRowView:
 
Se il codice è letteralmente quello che hai postato, mi sa che ti sei dimenticato di impostare .DisplayMember


Che capra, l'avevo commentato!!!
ora funziona tutto
grazie
Marco