原理圖
PS:Read()使指針下移,同時銷毀上一條。所以SqlDataReader是只進的。
GetValue()是找當前行中的列
SqlDataReader()特性。
1)只進的 上面原理圖描述了。
2)只讀的 SqlDataReader只能獲取,不能修改。
3)使用SqlDataReader必須保證,Connection的狀態是打開的。
因為結果集存儲在數據庫服務器中,不打開連接是找不到。
1.reader.GetValue(0)
沒有列名的重載。
2.reader[1]
索引器就是用GetValue(0)實現的。
3.reader["列名"]
內部通過GetOrdinal()實現的//先獲取索引int index = reader.GetOrdinal(columnName);//再通過索引找到對應的列。reader.GetValue(index);/***注意***:reader["列名"]的執行效率非常差,不建議使用。因為如果這樣的語句在循環中,循環多少次,就會執行多少次沒用的 int index = reader.GetOrdinal(columnName);*/
//把獲取列名寫在循環外頭。int c1 = reader.GetOrdinal("列名");while(reader.Read()){ object obj = reader[c1];}
reader.GetString(0); reader.GetINT32(1);reader.GetDouble(2);//數據庫里的float,這里要用Double。
為什么要獲取強類型呢?
因為Object對象在使用時,要進行一次拆箱,要有性能損耗的。
do{ if(reader.HasRows) { while(reader.read()) { /*讀數據*/ } } }//如果有其他結果集,就繼續循環!while(reader.NextResult());
if(reader.HasRows){ while(reader.Read()) { //遍歷列 for(int i =0;i<reader.FieldCount;i++) { //獲取數據類型 string dbType =reader.GetDataTypeName(i); switch(dbType) { case "varchar": case "nvarchar" case "char": case "nchar": reader.GetString(i) ;//簡寫 break; case "int": ...... } } }}
當結果集中的列為null,并且需要用強類型獲取時,需要用IsDBNull判斷一下。
string obj = reader.IsDBNull(0)? "" : reader.GetString(0);
新聞熱點
疑難解答