Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Query SQL dinamica

13 views
Skip to first unread message

Maurizio S.

unread,
Mar 4, 2012, 11:01:00 AM3/4/12
to

Sto iniziando ad interrogare le basi di dati in Visual Studio.NET.

Solitamente clicko col destro sul TableAdapter (nella finestra di
progettazione del form) e creo la query tramite "Aggiungi query...".

Vorrei ora creare un form per effettuare la ricerca in una tabella, dove
l'utente può valorizzare dei campi qualsiasi (ad es. soltanto il
cognome, o soltanto il nome) e poi avviare la ricerca.

La query che ho creato è qualcosa del genere:

SELECT * FROM t WHERE (cognome = @c) AND (nome = @n) AND ...

Ora, se viene valorizzato soltanto il campo nome sul form, sarà eseguita
una query del tipo:

SELECT * FROM t WHERE (cognome = '') AND (nome = 'Maria') AND ...

E questo porterà a risultati errati.

Come faccio a fare in modo che la query eseguita sia questa:

SELECT * FROM t WHERE (nome = @n) AND ...

?

In alternativa, come poter inserire le wildcards nella query?

Qualcosa come: WHERE (cognome = '%[@c]%')

In questo modo, se anche il parametro @c è vuoto, non influirà sulla
query.

Preferirei però la prima soluzione, dato che per una condizione inutile
come (cognome = '%%') magari il dbms si metterà a fare il confronto per
ogni singolo record comunque, con relativo spreco di tempo e risorse.

Devo per forza creare la query dinamicamente, da codice?

Saluti, m.

Thanatos

unread,
Mar 4, 2012, 11:06:52 AM3/4/12
to
On Sun, 04 Mar 2012 17:01:00 +0100, "Maurizio S." <mau...@esse.it>
wrote:

> Solitamente clicko col destro sul TableAdapter (nella finestra di
> progettazione del form) e creo la query tramite "Aggiungi query...".

Mmm... Casomai volessi aggiungere una query da codice, in fase di
run-time, è possibile farlo oppure devo procedere in altro modo?

Grazie, m.

LudovicoVan

unread,
Mar 4, 2012, 11:28:33 AM3/4/12
to
"Maurizio S." <mau...@esse.it> wrote in message
news:9d47l7luljjld0kkj...@4ax.com...
Non ci sono particolari problemi di performance (SQL Server fa anche lui le
sue ottimizzazioni), la differenza piu' significativa e' nel cambio di
semantica: da "equals" a "contains". Personalmente risolvo il problema con
un po' di logica nell'SQL, in questo caso qualcosa del tipo:

cognome = CASE WHEN LEN(@cognome) = 0 THEN cognome ELSE @cognome END

> Devo per forza creare la query dinamicamente, da codice?

Puoi usare stored procedures, e avendo cura di passare NULL quando il
parametro e' vuoto (convert empty string to null o simili) le condizioni si
semplificano a:

cognome = ISNULL(@cognome, cognome)

Non posso essere molto piu' preciso di cosi' perche' praticamente non uso
WinForms, but you get the picture...

-LV


0 new messages