SqlDataReader 提供一种从SQLServer数据库中读取数据只能前进的数据流的方式。
目录
特点:
快速的、轻量级的、只读的,遍历访问每一行数据的数据流,向一个方向,一行一行的,不能向后读取,不能修改数据
缺点:
不灵活,只适合数据小的情况,读取数据,一直占用连接
读取方式:
Read() 获取第一行的数据,再次调用Read()方法;当调用Read()方法返回【false】时,就表示不再有数据行
注意:
使用该对象,读取数据时,需要连接对象一直保持Open状态,如果连接关闭,是不能读取数据的。使用完成过后,应该马上使用close()关闭,不然Reader对象会一直占用连接。
创建方式:
不能直接构造,需要cmd.ExecuteReader()来创建。cmd.ExecuteReader(CommandBehaviour.CloserCoonection)—以此方式创建,会在关闭reader对象时,会自动关闭连接。
读取时,尽量使用于数据库字段类型相匹配的方式来获取对应的值,避免重复的装箱拆箱操作,造成性能的损耗。
没有读取到末尾就要关闭reader对象时,先调用cmd.Canel(),然后在带哦用reader.Close()
cmd.ExecuteReader()获取存储过程的返回值或输出参数,先调用reader.Close(),然后才能获取参数的值。
常用属性:
Connection:获取与Reader对象相关的SqlConnection
FiedCount:当前行中的列数
HasRows:reader是否包含一行还是多行
IsClosed:reader对象是否已关闭 true/false
Item[int]:列序号,给定列序号的情况,获取指定列的值 dr[1] object
Item[String]:列名,获取指定列的值
常用方法:
Close() 关闭dr
GetInt32(序列号) 根据数据类型相匹配 获取列值的方法
GetFieldType(i) 获取数据类型的type
GetName() 获取指定列的列名
GetOrdinal() 获取指定列名的列序号
Read() 使dr前进到下一条记录
NextResult() 使dr前进到下一个记录
示例:
dr["列名] 或 dr[列序号]
static void TestExecuteReader2()
{
string str = ConfigurationManager.ConnectionStrings
["connStr"].ConnectionString;
SqlConnection connection = new SqlConnection(str);
string sql = "select * from tesTable";
SqlCommand command = new SqlCommand();
command.CommandText = sql;
command.Connection = connection;
connection.Open();
SqlDataReader dr = command.ExecuteReader();
int index = dr.GetOrdinal("uName"); //获取指定列的列序号
Console.WriteLine("uName 列的列序号为: "+index);
string name = dr.GetName(0); //获取指定列的列名
Console.WriteLine("列序号为 0 的列名为: " + name);
int ageIndex = dr.GetOrdinal("age");
Console.WriteLine("\n记录内容显示 :");
while (dr.Read())
{
string uNameValue = dr.GetString(0); //使用列的列序号获取数据
string pwdValue = dr["uPwd"].ToString(); //使用列名获取数据
int ageValue = dr.GetInt16(ageIndex); //避免装箱拆箱
Console.WriteLine(uNameValue + "\t" + pwdValue + "\t" + ageValue);
}
connection.Close();
}
运行结果: