// Delegue definissant la mise jour la grille lors du callback public delegate void ProcessDelegate(IDataReader dr);
// Methode executee en callback private void ExecuteOnCallBack(IAsyncResult result) { // Recuperation de la commande initiale passee en parametre lors du BeginExecuteReader SqlCommand cmd = (SqlCommand)result.AsyncState; SqlDataReader reader = cmd.EndExecuteReader(result); // Verifie si le handle du controle a ete cree sur un autre Thread ou pas. if (dataGridView1.InvokeRequired) dataGridView1.Invoke(new ProcessDelegate(Process), new object[] { reader }); else Process(reader); }
// Methode executee pour realiser la liaison de donnees public void Process(IDataReader dr) { BindingSource source = new BindingSource(); source.DataSource = dr; dataGridView1.DataSource = source; dr.Close(); }
private void Form1_Load(object sender, EventArgs e) { // La chaine de connexion doit etre positionnee dans un fichier de configuration. En dur dans le code, c'est Mal ! string connectionString = "data source=(local);initial catalog=Northwind;user id=sa;password=XxXx;async=true"; SqlConnection cn = new SqlConnection(connectionString); cn.Open(); SqlCommand cmd = cn.CreateCommand(); cmd.CommandText = "sSelectOrdersDetail"; cmd.CommandType = CommandType.StoredProcedure; // Appel asynchrone IAsyncResult iar = cmd.BeginExecuteReader ( new AsyncCallback(ExecuteOnCallBack), cmd, CommandBehavior.CloseConnection ); }
CREATE PROCEDURE dbo.sSelectOrdersDetail ( @OrderID INT = NULL ) AS BEGIN WAITFOR DELAY '000:00:10' SELECT [Order Details].* FROM [Order Details] WHERE ( (@OrderID IS NULL) OR (OrderID = @OrderID) ) END