1. 程式人生 > >複習ADO.NET的ExecuteReader()方法

複習ADO.NET的ExecuteReader()方法

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中讀取所有記錄列印到螢幕:

class Program
    {
        static void Main(string[] args)
        {
            string constr = @"server=.\SQLEXPRESS;database=MyDataBase;uid=sa;pwd=sa";
            //string constr = @"server=.\SQLEXPRESS;database=MyDataBase;Integrated Security=True";


            


            using (SqlConnection sqlconn = new SqlConnection(constr))
            {
                string cmdstr = @"select * from Student";
                using (SqlCommand cmd = new SqlCommand(cmdstr, sqlconn))
                {
                    if (sqlconn.State == ConnectionState.Closed)
                    {
                        sqlconn.Open();
                    }
                    SqlDataReader reader= cmd.ExecuteReader();


                    if (reader.HasRows)//HasRows判斷reader中是否有資料
                    {
                        while(reader.Read())  //Read()方法讀取下一條記錄,如果沒有下一條,返回false,則表示讀取完成
                        {
                            int id = reader.GetInt32(0);
                            string name = reader.GetString(1);
                           string  gender = reader.GetBoolean(3) == true ? "男" : "女"; //運用了三元表示式
                            int age = reader.GetInt32(2);


                            Console.WriteLine("\t{0}\t{1}\t{2}\t{3}\r\n",id,name,gender,age);
                        }


                        Console.ReadKey();
                    }
                
                }


            }
        }
    }



//reader的第二種輸出(遍歷)方式,使用索引,效率會稍微低點,因為通過索引得到的為物件(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 ? "男" : "女"));
                        //}


 //第二種輸出方式,使用索引,效率會稍微低點,因為通過索引得到的為物件(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 ? "男" : "女"));
                        //}