利用SqlDataReader進行批次查詢
寫過ADO.Net的朋友們都知道,應用程式中若想連接SQL Server,單純只顯示資料給使用者,那麼利用SqlDataReader來處理會是最好的選擇。就理論而言它的效能會比SqlDataAdapter來的好,而SqlDataReader無法直接產生執行個體,必須藉由SqlCommand的ExecuteReader方法產生。若您有批次查詢的需求,可以利用SqlDataReader來處理。
假設你是使用下列的方式來查詢資料,那麼必須在每次SqlDataReader使用完畢之後利用Close方法關閉它,才能繼續給下一個SqlCommand來使用(如第16列)。
1: //準備連線字串
2: SqlConnectionStringBuilder SqlConStrBud = new SqlConnectionStringBuilder();
3: SqlConStrBud.DataSource = ".";
4: SqlConStrBud.InitialCatalog = "Northwind";
5: SqlConStrBud.IntegratedSecurity = true;
6:
7: using (SqlConnection SqlCon = new SqlConnection(SqlConStrBud.ToString()))
8: {
9: string strSQL = "select * from Orders;";
10: using (SqlCommand SqlCmd = new SqlCommand(strSQL, SqlCon))
11: {
12: if (SqlCon.State != ConnectionState.Open) SqlCon.Open();
13: SqlDataReader SqlReader = SqlCmd.ExecuteReader();
14: gvOrders.DataSource = SqlReader;
15: gvOrders.DataBind();
16: SqlReader.Close();
17:
18: SqlCmd.CommandText = "select * from [Order Details];";
19: SqlReader = SqlCmd.ExecuteReader();
20: gvOrderDetails.DataSource = SqlReader;
21: gvOrderDetails.DataBind();
22: SqlReader.Close();
23: }
24: }
您可以把批次查詢所要用到的T-SQL一次設定給SqlCommand的CommandText屬性,每個查詢之間利用分號(;)隔開,並利用SqlDataReader的NextResult方法來取得下一個結果集,如此一來就不需對SqlDataReader開開關關,而且T-SQL也可以集中在同一個地方來撰寫(如第列),筆者是認為這樣的寫法比較方便維護。
1: //準備連線字串
2: SqlConnectionStringBuilder SqlConStrBud = new SqlConnectionStringBuilder();
3: SqlConStrBud.DataSource = ".";
4: SqlConStrBud.InitialCatalog = "Northwind";
5: SqlConStrBud.IntegratedSecurity = true;
6:
7: using (SqlConnection SqlCon = new SqlConnection(SqlConStrBud.ToString()))
8: {
9: string strSQL = "select * from Orders;"
10: + " select * from [Order Details];";
11: using (SqlCommand SqlCmd = new SqlCommand(strSQL, SqlCon))
12: {
13: if (SqlCon.State != ConnectionState.Open) SqlCon.Open();
14: SqlDataReader SqlReader = SqlCmd.ExecuteReader();
15: gvOrders.DataSource = SqlReader;
16: gvOrders.DataBind();
17:
18: //讀取下一個ResultSet
19: SqlReader.NextResult();
20: gvOrderDetails.DataSource = SqlReader;
21: gvOrderDetails.DataBind();
22: SqlReader.Close();
23: }
24: }
【結論】
- 使用這種方式進行批次查詢雖然方便,但切記必須只篩選您所會用到的欄位,避免使用SELECT * FROM TableName的方式來回傳所有欄位。
- 應避免一次傳回過多的結果集。