最近頻繁用到了DataReader這個對象,其實對于DataReader,之前也用到過,說實話我個人覺得很不好懂。相比之下覺得DataSet對象好用的多,但是有時取出的數據不需要很多的時候,DataReader還是很有用的。
在此就對DataReader進行一下解釋,這也是個人對DataReader的理解,難免會有錯誤,大家互相學習下。有理解上的錯誤也希望大家能過指正出來,幫助我更好的理解,謝謝。
首先DataReader相比于DataSet,DataReader是一個抽象類,所以不能用
DataReader DR = new DataReader(),來構造函數創建對象,如果要創建一個DataReader對象,必須通過command對象的ExecuteReader方法。
其次,DataReader對象訪問數據的方式,只能順序讀取數據,而且不能寫入數據(這點DataSet占據絕對的優勢),所謂的順序讀取數據是將數據表中的行從頭至尾一次讀出。DataReader被創建時,紀錄指針在表的最前端,可以使用Read方法每次從表中讀取一條紀錄。
總的來說DataSet存的是二維數組,而DataReader存的是一維數組。而且DataSet采用的是非連接的傳輸模式訪問數據源,一旦用戶所請求的數據讀入DataSet,與數據庫的連接就關閉,而DataReader則要時刻保持與數據庫連接狀態。
就我來說,重要的和常用的屬性和方法:
FieldCount屬性 獲取DataReader對象所包含的紀錄行數
Close() 關閉DataReader對象
其實有各種GetBoolean(col),GetChar(col),GetString(col),GetDateTime(col),GetInt32()等等獲取序號為col的列的值,而這些基本上可以被GetValue(col)方法所取代。
GetValue(col) 獲取序號為col的列的值
GetValues(values) 獲取所有字段的值,并將字段值存放到values數組中
GetValues(values)方法原來我不會用,特別是對于這個values數組是哪里來的,以及如果自定義該定義為什么類型呢,后來百度就知道了,用這個方法之前,Object[] values = new Object[sqlrd.FieldCount];這個是定義values數組的方法前提。
Read() 讀取下一條紀錄,返回布爾型,返回true,則表示有下一條紀錄。一般這個方法與while()循環一起用。是DataReader對象最重要的一個方法。
其他的無關痛癢的方法:(我覺得這個在提取數據的時候,不知道具體的數據類型,用來查看數據的數據類型的作用居多,或者用來查找問題調試吧。反正我一般用不到這些個方法)
GetDataTypeName(col) 獲取序號為col的列的來源數據類型名
GetFieldType(col) 獲取序號為col的列的數據類型,一般顯示會是System.**
GetName(col) 獲取序號為col的列的字段名
GetOrdinal(name) 獲取字段名為name的列的序號
?| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 | PRotected void Page_Load(object sender, EventArgs e){string price = Request.QueryString["價格"];string con = ConfigurationManager.ConnectionStrings["con"].ToString();SqlConnection sqlcon = new SqlConnection(con);string sql = "select * from Cloths where 價格 = '" + price + "'";//string sql = "select * from Cloths";sqlcon.Open();SqlCommand sqlcom = new SqlCommand(sql, sqlcon);SqlDataReader sqlrd;sqlrd = sqlcom.ExecuteReader();Response.Write("獲取DataReader對象包含的記錄行數,注意這里DataReader的結構跟數據庫的結構是不一樣的,它把數據庫的一行轉換成了一列:" + sqlrd.FieldCount);Response.Write("<br>");Response.Write("獲取序號為0的列的來源數據類型名:" + sqlrd.GetDataTypeName(0));Response.Write("<br>");Response.Write("獲取序號為0的列的數據類型:" + sqlrd.GetFieldType(0));Response.Write("<br>");Response.Write("獲取序列號為0的列的字段名:"+sqlrd.GetName(0));Response.Write("<br>");Response.Write("獲取字段名為品牌的列的序號:"+sqlrd.GetOrdinal("品牌"));Response.Write("<br>");while (sqlrd.Read()){Response.Write("<br>");Response.Write(sqlrd["id"] + "," + sqlrd["品牌"] + "," + sqlrd["價格"] + "," + sqlrd["數量"]);Response.Write("<br>");Response.Write("<br>");Response.Write("下面的顯示要注意,為什么序列號為0的是品牌而不是id,雖然GridViewCommon頁面第一列是id,不過這里是要充分尊重數據庫的結構,可以看出數據庫中第一列是品牌!");Response.Write("<br>");Response.Write("這里通過GetString函數取出序號為0的列的數據,這里要根據數據的不同類型選用不同的Get函數,可能是GetChar(),GetInt32()等等:"+sqlrd.GetString(0));//這里可以看出GetValue函數可以不需要事先知道每一列的數據類型就可以取出數據,所以盡量用GetValue函數Response.Write("<br>");Response.Write("這里通過GetValue函數取出序號為0的列的數據,不需要管數據時什么類型,這里注意跟上面的比較:" + sqlrd.GetValue(0));Response.Write("<br>");Response.Write("<br>"java plain" |