Ö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