1. 程式人生 > >使用多結果集讀取數據減少服務器往返,提高性能

使用多結果集讀取數據減少服務器往返,提高性能

ive resultset multipl his sets 只讀 ade grid 填充

先來談一下什麽是多結果集?以及為什麽需要它?

假設我們的一個窗體上有多個控件,需要綁定多個數據源。那麽傳統情況下,我們可以用不同的命令去讀取不同的數據,然後分別綁定。這樣做本來無可厚非,但如果從性能上考慮的話,就有改進的必要了。

因為每個單獨的命令執行都是需要發生一次服務器的往返的,所以如果能夠把數據一次性讀取到,統一發給用戶程序,再在客戶端做單獨的綁定,這樣的設計可以減少服務器往返次數,提高性能。

以下是一些代碼和比較

使用DataReader執行單結果集查詢:每次返回一個結果集。(這是傳統的方式)

using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString))
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT CustomerID FROM Customers";
conn.Open();
SqlDataReader reader1 = cmd.ExecuteReader();
DataTable tb1 = new DataTable();
tb1.Load(reader1);

listBox1.DataSource = tb1;
listBox1.DisplayMember = "CustomerID";
reader1.Close();

SqlCommand cmd2 = conn.CreateCommand();
cmd2.CommandText = "SELECT OrderID,OrderDate FROM Orders";
SqlDataReader reader2 = cmd2.ExecuteReader();
DataTable tb2 = new DataTable();
tb2.Load(reader2);
dataGridView2.DataSource = tb2;
reader2.Close();
conn.Close();
}

很顯然,這樣的話,就會發生兩次的服務器往返。(兩次批處理的過程)

技術分享

使用DataReader做多結果集查詢:一次性讀取兩個表格的數據

using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString + ";MultipleActiveResultSets=true"))
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT CustomerID FROM Customers;SELECT OrderID FROM Orders

";
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
listBox1.Items.Add(reader[0].ToString());
}

while (reader.NextResult())
{
while (reader.Read())
{
listBox2.Items.Add(reader[0].ToString());
}
}

reader.Close();
conn.Close();
}

技術分享

需要特別註意的是,因為DataReader是一個只向前,只讀的遊標集。所以如果它的結果集有超過一個,需要通過NextResult方法進行移動。同時,還需要啟用MARS:多活動結果集 的支持。

如果換成是DataSet的方式,就無需這麽麻煩,因為DataSet天生就是支持多個表格,在用DataAdatper的Fill方法填充數據的時候,它會自動地建立多個表格在DataSet裏面。

using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString))
{
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT CustomerID FROM Customers;SELECT OrderID FROM Orders";
conn.Open();

SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
adapter.Fill(ds);

this.listBox1.DataSource = ds.Tables[0];
listBox1.DisplayMember = "CustomerID";
this.dataGridView2.DataSource = ds.Tables[1];
conn.Close();
}

技術分享

使用多結果集讀取數據減少服務器往返,提高性能