10 Mayıs 2012 Perşembe

ADO.NET 'de MARS ve Backgroundworker

Merhaba arkadaşlar.
Önceki yazılarımda, Ado.Net namespace 'lerini kullanarak "connected" mimaride uygulama geliştiriyorsak ve aynı bağlantı üzerinde birden fazla "DataReader" nesnesinin senkronize çalışmasını istiyorsak "MARS (MultipleActiveResultSets)" kullanmamız gerekliliğinden bahsetmiştim. "SqlConnection" nesnemizin "connection string" parametresine "MultipleActiveResultSets=true" ifadesini ekleyerek bu sorunu ortadan kaldırıyorduk. Bu işlemlerin daha bir senkronize ve hızlı gerçekleşebilmesi için genellikle "BackgroundWorker" kontrolü ile birlikte kullanılır. Bu yazımda MARS özelliğini ve "BackgroundWorker" kontrolünün birlikte nasıl kullanmamız gerektiğini inceleyeceğiz. Aşağıdaki gibi bir form hazırlıyorum.

Formumda bir "Button", iki "ListView", bir "ProgressBar" ve "BackgroundWorker" kontrollerini kullanacağım. "BackgroundWorker" arka planda "Thread" çalıştıracağından dolayı yasal olmayan thread çağrılarını kontrol edilmemesini "CheckForIllegalCrossThreadCalls = false" komutu ile sağlıyorum.

public FrmMARS()
{
    CheckForIllegalCrossThreadCalls = false;
    InitializeComponent();
}

SqlConnection conneection = new SqlConnection("Server=. ; Database=Northwind ; trusted_connection=true");

private void btnProCat_Click(object sender, EventArgs e)
{
    listView1.Items.Clear();
    listView2.Items.Clear();
    backgroundWorker1.RunWorkerAsync();
    SqlCommand command = new SqlCommand("SELECT ProductID, ProductName, s.CompanyName, c.CategoryName, UnitsInStock, UnitPrice FROM dbo.Products p INNER JOIN dbo.Suppliers s ON p.SupplierID = s.SupplierID INNER JOIN dbo.Categories c ON c.CategoryID = p.CategoryID",   conneection);
    if (conneection.State != ConnectionState.Open)
    {
        conneection.Open();
        progressBar1.Style = ProgressBarStyle.Marquee;
    }
    SqlDataReader reader = command.ExecuteReader();
    while (reader.Read())
    {
        ListViewItem lvi = new ListViewItem();
        lvi.Text = reader.GetInt32(0).ToString();
        lvi.SubItems.Add(reader.GetString(1));
        lvi.SubItems.Add(reader.GetString(2));
        lvi.SubItems.Add(reader.GetString(3));
        lvi.SubItems.Add(reader.GetInt16(4).ToString());
        lvi.SubItems.Add(reader.GetDecimal(5).ToString());
        listView1.Items.Add(lvi);
    }
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    SqlCommand com2 = new SqlCommand("SELECT CategoryID, CategoryName, Description FROM dbo.Categories", conneection);
    if (conneection.State == ConnectionState.Connecting)
    {
        Thread.Sleep(100);
    }
    if (conneection.State == ConnectionState.Closed)
    {
        conneection.Open();
        progressBar1.Style = ProgressBarStyle.Marquee;
    }
    SqlDataReader dr2 = com2.ExecuteReader();
    while (dr2.Read())
    {
        ListViewItem lvi = new ListViewItem();
        lvi.Text = dr2.GetInt32(0).ToString();
        lvi.SubItems.Add(dr2.GetString(1));
        lvi.SubItems.Add(dr2["Description"].ToString());
        listView2.Items.Add(lvi);
    }
    conneection.Close();
    progressBar1.Style = ProgressBarStyle.Blocks;
}

Hiç yorum yok:

Yorum Gönder