Press "Enter" to skip to content

Come eseguire una query filtrata su SQL Server alla modifica del testo su una textbox

Un esempio creato in risposta ad una domanda sui forum Microsoft  Il thread lo trovate qui dove un utente chiedeva quale sia il modo per passare la stringa di una textbox ad una query SQL per effettuare il filtraggio sui dati inseriti dall’utente.

L’applicazione che ho creato è molto semplice. Anche se vi ho inserito un trucco da programmatore esperto.

form1_01

Ho creato la soluzione Windows forms standard e in form1 ho inserito:

  • textbox1 – una semplice textbox
  • datagridview1 – una datagridview
  • timer1 – un timer windows forms

Per il test ho usato il famigerato database Northwind che potete trovare A questo indirizzo se non ne avete una copia già sul vostro PC ma ovviamente potete rapidamente modificarlo con il vostro database.

Il codice dietro alla Form

Iniziamo con le dichiarazioni delle variabili a livello di classe

private const string SQL_Search = "SELECT * FROM customers WHERE CompanyName = @Search OR ContactName = @Search OR Address = @Search OR City =@Search";
private const string SQL_AllData = "SELECT * FROM customers";

//the .\\ in my data source is set because my sql server is a default instance so it has
//the name of my pc or .\ can be used the double backslash is due to the use of backslash in C# strings
//If you have a named instance like .\SqlExpress or Mypc\myinstance remember to replace it to make it work.
private string mConnectionString = "data source=.\\;initial catalog=NORTHWND;integrated security=SSPI;";
DataTable mItemsSource = null;

Le due query vengono eseguite sulla tabella customers del database northwind, la prima, effettua una ricerca di tipo “Contiene” all’interno di alcuni dei campi della tabella del database.
La seconda carica l’intera tabella e viene eseguita in 2 casi, all’apertura dell’applicazione oppure se l’utente cancella il contenuto della casella di ricerca.

La stringa di connessione, contiene un commento per ricordare a chi scaricasse il codice di cambiare il nome dell’istanza di SQL Server se necessario, aggiungo di modificare anche il nome del database perché quando l’ho rigenerato sul mio ultimo PC l’ho chiamato NORTHWND (manca una i).

public Form1()
{
InitializeComponent();
StartPosition = FormStartPosition.CenterScreen;
}

Il costruttore, contiene solo l’istruzione per fare apparire la finestra in mezzo al monitor corrente.

private void Form1_Load(object sender, EventArgs e)
{
timer1.Interval = 300;
timer1.Enabled = false;
timer1.Start();
}

Sull’evento Load della form, abbiamo inserito l’inizializzazione del timer e la prima esecuzione del caricamento (con tutti i dati) se non volete caricare i dati inizialmente (soprattutto se ne avete molti) togliete l’istruzione start del timer ed il timer verrà fatto partire quando l’utente inizia a scrivere sulla casella di testo.

private void textBox1_TextChanged(object sender, EventArgs e)
{
//Blocks the timer if already ticking to avoid execution
//of the search if the user is typing
timer1.Stop();
//Starts the timer so that when the user stops typing the search is executed
timer1.Start();
}

L’evento TextChanged della textbox1, qui fermiamo e facciamo ripartire il timer, perché fermarlo? perché così deve ripartire ed evitiamo che a ogni tasto premuto venga eseguita la query sul database, l’intervallo di 300 millisecondi dovrebbe comodamente permettere all’utente di scrivere la stringa e far partire la ricerca quando finisce, ma potete regolarlo su un tempo più lungo se volete (se i vostri utenti sono dattilografi lenti).

private void timer1_Tick(object sender, EventArgs e)
{
//Executes the search
try
{
timer1.Stop();
using (SqlConnection cn = new SqlConnection(mConnectionString))
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = cn;
if (textBox1.Text == null || textBox1.Text.Trim().Length == 0)
{
cmd.CommandText = SQL_AllData;
}
else
{
cmd.CommandText = "SELECT * FROM customers WHERE CompanyName like @Search OR ContactName like @Search OR Address like @Search OR City like @Search";
SqlParameter[] para = new SqlParameter[] {
new SqlParameter( "@Search", string.Format("%{0}%",textBox1.Text))
};
cmd.Parameters.Clear();
cmd.Parameters.AddRange(para);
}
cmd.CommandType = CommandType.Text;
cn.Open();
SqlDataReader reader = cmd.ExecuteReader();
mItemsSource = new DataTable();
if (reader.HasRows)
{
mItemsSource.Load(reader);
}
else
{
MessageBox.Show("No records found responding to search criteria");
}
reader.Close();
cn.Close();
dataGridView1.DataSource = mItemsSource;
}
}
catch (Exception ex)
{

MessageBox.Show(ex.Message);
}

}

L’evento Tick del timer, come vedete, la prima cosa da fare è fermare il timer, oppure eseguirà la query mille volte, poi creiamo la connessione a database, assegnamo la query corretta al SqlCommand in base al fatto che vi sia o meno una stringa nella textbox ed eseguiamo la query con un SqlDataReader, usandolo poi per generare una nuova DataTable che assegneremo come DataSource alla datagridview1.

Tutto molto semplice e lineare.

Se avete domande, la form di contatto arriva direttamente a me, oppure potete sempre chiedere sul forum Microsoft, lo leggo quasi quotidianamente.

 

Potete scaricare il progetto esempio dal link qui indicato:

Per qualsiasi domanda, approfondimento, commento, o per segnalare un errore potete usare il link al modulo di contatto in cima alla pagina.