ExecuteReader() 方法
解釋1:將SQL語句發送到指定連接 生成一個SqlDataReader對象
解釋2:當ExecuteReader()執行后返回一個SqlDataReader對象
兩種解釋實際上都在說明些方法就是給SqlDataReader對象一個可以訪問查詢到的結果的渠道。
程序執行分析
1、首先需要new一個SqlDataReader對象。接收ExecuteReader()執行后返回的SqlDataReader對象。
2、SqlDataReader的HasRows屬性可以判斷SqlDataReader中是否有(一行或多行)數據,返回bool值,有數據時為true,程序向下執行,開始進入讀取數據環節。
3、SqlDataReader的Read方法可以使SqlDataReader前進到下一條記錄,同樣返回bool值,當下一條無記錄返回false,則表示記錄讀取完畢;當下一條有數據時為true,將讀取到的數據(當前的一條記錄)暫存在SqlDataReader中。
4、SqlDataReader的一系列get方法可以獲取SqlDataReader中不同類型的值,保存到指定的變量中。
注:get方法參數為列數,即第幾列。
還有一點很重要,DataReader必須保證SqlConnection處於連接狀態。
練習:
從SQL Server數據表Student中讀取所有記錄打印到屏幕:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 string constr = @"server=.\SQLEXPRESS;database=MyDataBase;uid=sa;pwd=sa"; 6 //string constr = @"server=.\SQLEXPRESS;database=MyDataBase;Integrated Security=True"; 7 8 9 10 using (SqlConnection sqlconn = new SqlConnection(constr)) 11 { 12 string cmdstr = @"select * from Student"; 13 using (SqlCommand cmd = new SqlCommand(cmdstr, sqlconn)) 14 { 15 if (sqlconn.State == ConnectionState.Closed) 16 { 17 sqlconn.Open(); 18 } 19 SqlDataReader reader= cmd.ExecuteReader(); 20 21 if (reader.HasRows)//HasRows判斷reader中是否有數據 22 { 23 while(reader.Read()) //Read()方法讀取下一條記錄,如果沒有下一條,返回false,則表示讀取完成 24 { 25 int id = reader.GetInt32(0); 26 string name = reader.GetString(1); 27 string gender = reader.GetBoolean(3) == true ? "男" : "女"; //運用了三元表達式 28 int age = reader.GetInt32(2); 29 30 Console.WriteLine("\t{0}\t{1}\t{2}\t{3}\r\n",id,name,gender,age); 31 } 32 33 Console.ReadKey(); 34 } 35 36 } 37 38 } 39 } 40 }
1 //reader的第二種輸出(遍歷)方式,使用索引,效率會稍微低點,因為通過索引得到的為對象(object) 2 //while (reader.Read()) 3 //{ 4 5 // Console.WriteLine("\t{0}\t{1}\t{2}\t{3}\r\n", reader[0], reader[1], reader[2], reader[3]); 6 //} 7 //第三種,也是索引 ,方括號內指定數據庫中的列名 8 //while (reader.Read()) 9 //{ 10 11 // Console.WriteLine("\t{0}\t{1}\t{2}\t{3}\r\n", reader["sId"], reader["sAge"], reader["sName"], ((bool)reader["sGender"] == true ? "男" : "女")); 12 //}
//第二種輸出方式,使用索引,效率會稍微低點,因為通過索引得到的為對象(object)
//while (reader.Read())
//{
// Console.WriteLine("\t{0}\t{1}\t{2}\t{3}\r\n", reader[0], reader[1], reader[2], reader[3]);
//}
//第三種,也是索引 ,方括號內指定數據庫中的列名
//while (reader.Read())
//{
// Console.WriteLine("\t{0}\t{1}\t{2}\t{3}\r\n", reader["sId"], reader["sAge"], reader["sName"], ((bool)reader["sGender"] == true ? "男" : "女"));
//}