Ricerca multipla

venerdì 27 maggio 2011 - 09.56

gianni01 Profilo | Newbie

Salve a tutti vorrei fare una ricerca multipla in un database, ovvero ho una form con una decina di controllo in cui inserisco dei valori da cercare, ma devo avere la possibilità di poter fare la ricerca sia inserendo un solo valore che 2 - 3 o tutti.
La select che sto tentando di costruire è fatta in questo modo:

Using cmd As New SqlClient.SqlCommand("SELECT * FROM tbMacchinario " & _
"WHERE AnnoFabbrica LIKE @AnnoFabbrica " & _
"AND Dimensioni LIKE @Dimensioni " & _
"AND Campi LIKE @Campi " & _
"AND Cilindri LIKE @Cilindri " & _
"AND Capacita LIKE @Capacita " & _
"AND Foulard LIKE @Foulard " & _
"AND Corde LIKE @Corde " & _
"AND Codice LIKE @Codice " & _
"AND RifMacchina LIKE @RifMacchina " & _
"AND Alimentazione LIKE @Alimentazione", Conn)


cmd.Parameters.AddWithValue("@AnnoFabbrica", cmbAnno.Text)
cmd.Parameters.AddWithValue("@Dimensioni", cmbDimensioni.Text)
cmd.Parameters.AddWithValue("@Campi", cmbCampi.Text)
cmd.Parameters.AddWithValue("@Cilindri", cmbCilindri.Text)
cmd.Parameters.AddWithValue("@Capacita", cmbCapacita.Text)
cmd.Parameters.AddWithValue("@Foulard", cmbFoulard.Text)
cmd.Parameters.AddWithValue("@Corde", cmbCorde.Text)
cmd.Parameters.AddWithValue("@Codice", cmbCodiciMacchina.Text)
cmd.Parameters.AddWithValue("@RifMacchina", txtRifMacchina.Text)
cmd.Parameters.AddWithValue("@Alimentazione", cmbAlimentazione.Text)



Ma ovviamente non ottengo nessun risultato, potete darmi una mano.
Ho tralasciato tutta la gestione della connessione e la creazioen del dataset che ho verificato essere funzionanti.
Grazie a tutti

AntCiar Profilo | Expert

Ciao.

Allora da come ho potuto vedere sono tutte TextBox quelle in cui inserisci i valori da cercare.
Come prima cosa metti tutte le TextBox di ricerca in un panel o in groupbox.
Poi associa alla proprietà Tag di ogni textBox il nome del campo associato a database per la ricerca.

Poi dove ti costruisci la tua stringa di SELECT per effettuare la ricerca mettici questo:
(dove trovi scritto 'Me.Panel1.' devi sostituirlo con il nome del tuo panel o group box)


Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Praticamente non fai altro che questo:
Scorrere i controlli presenti nel panel o GroupBox
Per ogni controllo viene visto se è di tipo TextBox e se il valore di Text è pieno.
In caso affermativo, aggiunge a WhereCondition il valore della sua proprietà tag ed il relativo valore inserito e viene aggiunto anche il parametro al command.

Poi viene riscritta la select passando la variabile WhereCondition



Cristian Barca

gianni01 Profilo | Newbie

Grazie AntCiar, adesso provo a mettere in pratica il tuo suggerimento, volevo solo fare una piccola precisazioen, se guardi bene non sono tutte textbox, ma ci sono anche combobox.
Spero che non faccia differenza la cosa.
Grazie ancora provo, poi ti faccio sapere.

AntCiar Profilo | Expert

no invece fa differenza.

ti riscrivo solo il blocco del For Each

PS. Ovviamente valorizza anche per le comboBox il campo Tag come per le TextBox

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Ciao ciao
Cristian Barca

gianni01 Profilo | Newbie

Using cmd As New SqlClient.SqlCommand("SELECT * FROM tbMacchinario WHERE " & WhereCondition & ";", Conn)



Mi da errore di sintassi qui (;) perchè ?
Grazie

AntCiar Profilo | Expert

Teoricamente non dovrebbe darti errore di sintassi.
Comunque puoi anche togliere il ;

Era solo per chiudere la select
Cristian Barca

gianni01 Profilo | Newbie

Ciao AntCiar, innanzi tutto ti ringrazio per la pazienza e l'aiuto che mi dai.
Il (;) avevo già provato da solo ad eliminarlo e avevo riscritto la SELECT in questo modo:
Using cmd As New SqlClient.SqlCommand("SELECT * FROM tbMacchinario WHERE " & "WhereCondition", Conn)

....... ma mi restituisce quest'altro errore:

Specificata espressione di tipo non booleano in un contesto in cui è prevista una condizione, in prossimità di 'WhereCondition'.

Sinceramente non saprei come risolvere la cosa.
Se ti può essere utile metto tutta la sub completa del comando.
Grazie ancora

AntCiar Profilo | Expert

>Using cmd As New SqlClient.SqlCommand("SELECT * FROM tbMacchinario
>WHERE " & "WhereCondition", Conn)
>

Cosi è sicuro che da errore. Praticamente quella stringa ha questo valore: "SELECT * FROM tbMacchinario WHERE WhereCondition"
Ti da errore perchè la parola WhereConditio così inserita nella stringa non va bene.

La sintassi corretta è:

"SELECT * FROM tbMacchinario WHERE " & WhereCondition
Cristian Barca

gianni01 Profilo | Newbie

Ciao, scusa ma sono ancora da capo:

Using cmd As New SqlClient.SqlCommand("SELECT * FROM tbMacchinario WHERE " & WhereCondition, Conn)

Sintassi non corretta in prossimità di 'WHERE'.









AntCiar Profilo | Expert

Ciao.

I parametri sbagliati stanno nella variabile WhereCondition.
fai questo:

Dim tmp as string = SELECT * FROM tbMacchinario WHERE " & WhereCondition

poi fai MessageBox.Show(tmp)

e mi mandi lo screenShot

Cristian Barca

gianni01 Profilo | Newbie


771x490 43Kb


eccoti il messaggio di errore

AntCiar Profilo | Expert

WhereCondition è vuota.
Ma la valorizzi?
Passa tutto il codice così ci diamo un occhiata.
Cristian Barca

gianni01 Profilo | Newbie

Questa è tutta la mia SUB:


Private Sub btnRicerca_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRicerca.Click


Conn = New SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("DBConnection").ConnectionString)

Dim WhereCondition As String = ""
Dim ctrl As Control

Dim tmp As String = "SELECT * FROM tbMacchinario WHERE " & WhereCondition



Using cmd As New SqlClient.SqlCommand("SELECT * FROM tbMacchinario WHERE " & WhereCondition, Conn)

MessageBox.Show(tmp)



For Each ctrl In Me.GroupBox1.Controls
If TypeOf (ctrl) Is TextBox Then
If Not CType(ctrl, TextBox).Text.Equals("") Then
WhereCondition = WhereCondition & CType(ctrl, TextBox).Tag.ToString() & " LIKE @" & CType(ctrl, TextBox).Tag.ToString() & " AND "
cmd.Parameters.AddWithValue("@" & CType(ctrl, TextBox).Tag.ToString(), CType(ctrl, TextBox).Text)
End If
ElseIf TypeOf (ctrl) Is ComboBox Then
If Not CType(ctrl, ComboBox).Text.Equals("") Then
WhereCondition = WhereCondition & CType(ctrl, ComboBox).Tag.ToString() & " LIKE @" & CType(ctrl, ComboBox).Tag.ToString() & " AND "
cmd.Parameters.AddWithValue("@" & CType(ctrl, ComboBox).Tag.ToString(), CType(ctrl, ComboBox).Text)
End If
End If
Next
WhereCondition = WhereCondition.Trim()
If WhereCondition.ToUpper().EndsWith("AND") Then
WhereCondition = WhereCondition.Remove(WhereCondition.Length - 3, 3)
End If


daMacchinario = New SqlClient.SqlDataAdapter(cmd)

daMacchinario.Fill(DS, "Risultati")
dgvMacchinario.DataSource = DS.Tables("Risultati") 'dgvMacchinario il DataGridView.

End Using


ID_Trasmesso = CStr(DS.Tables(0).Rows(0).Item("ID"))


'Try

' If String.IsNullOrEmpty(txtDimensione.Text) = True Then

' Exit Sub

' End If

' Dim Macchina = txtDimensione.Text.First

' TbMacchinarioBindingSource.DataSource = SimpleQuery(Macchina)
'Catch

' MessageBox.Show("Deve essere inserito almeno un parametro di ricerca" & Environment.NewLine & _
' "Inserire un valore.", "Attenzione.", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
' txtDimensione.Focus()

'End Try


End Sub


Grazi infinitamente dell'aiuto.

AntCiar Profilo | Expert

Ciao.

Hai fatto un po di confusione. La variabile WhereCondition la hai usata prima vuota e poi la riempi. Ovviamente così non funziona niente.
Ti riposto tutto corretto di seguito (ho ricopiato solo il corpo dell sub);


Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Cristian Barca

gianni01 Profilo | Newbie

Ciao AntCiar, in allegato ti invio il file con le spiegazioni e il docice che mi hai postato precedentemente, ma ancora ci sono problemi, ti chiedo gentilmente appena puoi di dare un'occhiata a quanto ho scritto nel file.
Grazie ancora dell'aiuto.

AntCiar Profilo | Expert

Ciao.

Ti ho risposto nel file che mi hai allegato
Cristian Barca

gianni01 Profilo | Newbie

Ciao AntCiar, in allegato ti invio un fle con una serie di informazioni sugli errori che ho .
Grazie infinitamente

AntCiar Profilo | Expert

Ciao.

Ti ho risposto in allegato.
Cristian Barca

gianni01 Profilo | Newbie

Continuo ada avere questo errore:

Option Strict On non ammette operandi di tipo Object per l'operatore '&'.

If CType(ctrl, TextBox).Text.Trim().Equals("") = Nothing And CStr("" & CType(ctrl, TextBox).Tag).ToString().Equals("") = Nothing Then

If CType(ctrl, ComboBox).Text.Trim().Equals("") = False And CStr("" & CType(ctrl, ComboBox).Tag).ToString().Equals("") = False Then

Ti allego il file con evidenziato l'errore

AntCiar Profilo | Expert

Scusami ma c'è stato un errore di copia e incolla e non me ne sono accorto.

dovrebbe essere così:

If CType(ctrl, TextBox).Text.Trim().Equals("") = Nothing And CStr("" & CType(ctrl, TextBox).Tag.ToString()).Equals("") = Nothing Then

If CType(ctrl, ComboBox).Text.Trim().Equals("") = False And CStr("" & CType(ctrl, ComboBox).Tag.ToString()).Equals("") = False Then
Cristian Barca

gianni01 Profilo | Newbie

Ciao AntCiar, sono profondamente demoralizzato, non riesco a risolvere la cosa.
Niente da fare ora mi dice:
Riferimento ad un oggetto non impostato su un'istanza di oggetto
Grazie.

AntCiar Profilo | Expert

Ciao Gianni.
In allegato ti ho messo un piccolo progetto di esempio che usa la tua Sub (ovviamente non fa alcuna select ma prepara solo l'istruzione)
dagli una occhiata e confrontalo con il comportamento del tuo progetto.

Poi per capire cosa succede nella tua form, controlla in debug il funzionamento del click sul bottone di ricerca.
Cristian Barca

gianni01 Profilo | Newbie

Ciao AntCiar, sei stato veramente di grande aiuto.
Ho capito dove stava il problema, io utilizzavo i tag del bandingsource, tu usavi i tag alla fine delle proprietà dei controlli
Grazie ancora, sei veramente bravo.
Alla prossima
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5