Query dinamica con parametri

giovedì 29 novembre 2007 - 16.43

paquito_ita Profilo | Senior Member

Ciao,

dovrei eseguire una query che usi come condizioni i campi di una form. Tali campi possono essere riempiti solo in parte (es. solo il 2° textBox).

Come faccio ad usare la funzionalità @param per reperire tali valori e costruire la query? (questo per non dover ricorrere a beceri controlli se tale campo esiste o meno e costruire un po' al kilo la query).

Qualcuno ha altrimenti un suggerimento per passare i parametri di una form con cui costruire una query?

Grazie!

motogpdesmo16 Profilo | Senior Member

io farei così:

Public Sub Genera_query (Optional ByVal p1 As string = " and 1 = 1", Optional ByVal p2 As string = " and 1 = 1", ..., Optional ByVal px As string = " and 1 = 1") 'praticamente passi tanti parametri quante sono le tue textbox

dim sqlQuery As String = ""

sqlQuery = "Select * from nometabella "
sqlQuery += "where 1 = 1" & p1 & p2 & ... & px
endsub

quando vai a richiamare la sub:

genera_query(textbox1.text, textbox2.text, ...., textboxX.text)

che ne pensi??

paquito_ita Profilo | Senior Member

>dim sqlQuery As String = ""
>
>sqlQuery = "Select * from nometabella "
>sqlQuery += "where 1 = 1" & p1 & p2 & ... & px
>endsub
>

>genera_query(textbox1.text, textbox2.text, ...., textboxX.text)


Si questa è una soluzione che pure a me è successivamente venuta in mente, anche se tuttavia dovrei fare dei controlli che il campo (i-esima TextBox per esempio) non sia vuota. Questo perché non tutti i campi della form sono obbligatori e quindi possono essere lasciati vuoti.

Quello che quindivorrei usare sarebbe una notazione del tipo:

select * from [Table] where (id=@id or @id is null) AND (title=@title or @title is null) AND ...

SO che è possibile (utilizo c#) tuttavia non ho avuto modo di programmare tanto con queste tecnologie e quindi non conosco tutto bene.
Sapresti un modo per ottenere un comportamento "un po più pulito" con tale notazione?

Grazie comunque per il suggerimento, se non riuscirò a trovare una soluzione a breve, userò proprio quello!

schifidus Profilo | Junior Member

Ciao,
beh se non vuoi usare una bella stored procedure , puoi comunque definire un command di tipo text e aggiungere dei parametri in questo modo

SqlConnection Connection = new SqlConnection("tua Connection string");
using (Connection)
{ SqlParameter parameter;
Connection.Open();
SqlCommand Command = new SqlCommand("insert into utente(nome,cognome)values(@nome,@cognome)");
command.CommandType = CommandType.Text;

parameter = new SqlParameter("@nome",SqlDbType.Text);
if (this.NomeTextBox.text == string.Empty)
parameter = DBNull.Value;
else
parameter.Value = this.NomeTextBox.Text;
Command.Parameters.Add(parameter);

parameter = new SqlParameter("@cognome", SqlDbType.Text);
if (this.CognomeTextBox.text == string.Empty)
parameter = DBNull.Value;
else
parameter.Value = this.NomeTextBox.Text;
Command.Parameters.Add(parameter);

command.ExecuteNonQuery();
Connection.Close();
}

ciao

paquito_ita Profilo | Senior Member

Ciao,

innanzitutto grazie. AL momento ho risolto con una soluzione "artigianale", dato che ho bisogno di avere in mano q.osa da far vedere al Boss che preme!

Appena posso provo l'iea suggerita (sperando non sorgano problem dovuti al fatto che uso Access come DB.

Dato che ci sono ti chiedo anche se mi potresti dire cosa sono le stored procedure e come si potrebbero usare, dato che ne ho sentito varie volte parlare ma non ho avuto finora modo di usarle. Io uso una classe che contiene le query da usare nell'applicazione (una sorta di query repository).

Potrei usare le stored procedure per questo scopo?

Grazie mille!

schifidus Profilo | Junior Member

Ciao,
certo se usi Access il codice che ho scritto non funziona,
devi usare il provider OLEDB.
Le stored procedure ti permettono di creare una netta separazione tra business layer e data layer nel senso che eviti di scrivere codice SQL direttamente nella tua applicazione.
Da codice richiami semplicemente la stored procedure che risiede nel tuo db passando i paramentri necessari.
Ciao.
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5