跟其他類一樣,使用它需要先聲明對象.SqlDataReader rd=new comd.ExecuteReader();(在使用SqlCommand對象的時候)
SqlDataReader有一個HasRows屬性,可以判斷出查詢的結果集中有沒有數據.可以把rd理解成有一個小人,他去數據庫中跑了一趟,目的是去看看在執行查詢後有沒有數據.回來的時候手裏有一張紙條,寫着有沒有數據.如果有數據,就可以再調用rd的reader()方法,去一條條的取數據放到本地.如果有多天數據可以用循環來讀取.
一個例子:
static void Main(string[] args)
{
string constr = "data source=thinkpad-think;initial catalog =itcast2013;integrated security=true";
using (SqlConnection conn = new SqlConnection(constr))
{
string sqlstr = "select * from tblperson";
using (SqlCommand comd = new SqlCommand(sqlstr, conn))
{
conn.Open();
using (SqlDataReader reader = comd.ExecuteReader())
{
if (reader.HasRows)
{
//在循環外面先根據列名獲取列的索引
int unameIndex = reader.GetOrdinal("uname");
int autoIdIndex = reader.GetOrdinal("autoId");
//然後在循環中使用 unameIndex,autoIdIndex來進行索引..就可以解決按照固定順序來進行顯示的問題
//根據索引獲取列名
//reader.GetName()
while (reader.Read())
{
//通過datareader獲取值,方法一:
//reader[index]通過reader的"索引器"來獲取列
//reader[列名]索引器也可以寫列名來訪問列數據
//方法二 :reader.getvalue(index);
//=========以上兩種那方法返回的都是object類型
//============"強類型"獲取列的數據
//這裏reader.getint32(列索引),索引取決於查詢時,指定的順序,並不是與表中的列索引始終一致
//切記:在循環裏面一定要使用列索引來獲取數據
//不要在循環中使用列名獲取數據
int autoid = reader.GetInt32(0);
string uname = reader.GetString(1);
//當表中數據爲null是,直接調用reader.getxxx()這種方法會報異常
//解決:先判斷當前列的數據是否爲null
int age = reader.IsDBNull(2) ? -1 : reader.GetInt32(2);
int height = reader.IsDBNull(3) ? -1 : reader.GetInt32(3);
Console.WriteLine( "{0} {1} {2} {3}",autoid,uname,age,height);
}
}
}
}
}
Console.ReadKey();
}