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

Query SQL dinamica

34 views
Skip to first unread message

Maurizio S.

unread,
Mar 4, 2012, 10:07:55 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.

Matteo Migliore

unread,
Mar 16, 2012, 7:00:28 PM3/16/12
to
> Solitamente clicko col destro sul TableAdapter (nella finestra di
> progettazione del form) e creo la query tramite "Aggiungi query...".

Roba preistorica :).

Lascia perdere i DataSet, almeno per le interrogazioni.

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

Rispondendo a tutte le domande precedenti, puoi usare Entity Framework e quindi LINQ per fare interrogazioni sul DB in modo indipendente dal DBMS e facendo tutto da codice C#, senza SQL.

Quarda queste solution:
http://sample.codeplex.com/wikipage?title=EntityFramework%20base%20usage
http://sample.codeplex.com/wikipage?title=Data%20Access%20alternatives

E su MSDN:
http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

giga...@gmail.com

unread,
Nov 3, 2012, 5:21:06 AM11/3/12
to
Il giorno domenica 4 marzo 2012 16:07:55 UTC+1, Maurizio S. ha scritto:
> Sto iniziando ad interrogare le basi di dati in Visual Studio.NET.
>
Visto che stai iniziando, può anche andar bene la preistoria per imparare.
>
>
> Solitamente clicko col destro sul TableAdapter (nella finestra di
>
> progettazione del form) e creo la query tramite "Aggiungi query...".
>
>
Lascia perdere queste diavolerie automatiche, che non ti aiutano a capire la logica di programmazione
>
> 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.
>
Dopo aver creato la form suppongo metterai un bottone cerca, non devi far altro che impostare il suo handler al click e catturati l'evento da code behind.
Eccoti un punto di partenza per la gestione eventi
http://www.techrepublic.com/article/working-with-events-in-c/1050284
>
>
> 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?

Ovviamente devi creare la query solo per quei campi che sono valorizzati nella form. Inoltre ti consiglio di non usare la concatenazione di stringhe che porta a query soggette a sql injection, ma usa gli sqlParameter. un buon punto di partenza lo trovi qui http://www.codeproject.com/Articles/4416/Beginners-guide-to-accessing-SQL-Server-through-C
>
>
>
> Saluti, m.
0 new messages