跟其他类一样,使用它需要先声明对象.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();
}