利用SqlDataReader進行批次查詢

利用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:  }

 

 

【結論】

  1. 使用這種方式進行批次查詢雖然方便,但切記必須只篩選您所會用到的欄位,避免使用SELECT * FROM TableName的方式來回傳所有欄位。
  2. 應避免一次傳回過多的結果集。