1. 数据读取器概述
数据读取器不能直接实例化,而是通过执行命令对象的ExecuteReader方法创建它的实例。
SqlDataReader rdr = cmd.ExecuteReader();
该数据读取器可用来访问查询的结果集。
(1). 使用序数索引器
示例使用while循环完成读取每行记录,由于Read()表示如果存在下一行,该方法返回true,否则,返回false
while(rdr.Read())
{
TBox_Text.Items.Add(rdr[0]);
}
这个程序使用了序数索引器查找方法,为读取器提供列号来获取值,索引0表示第一列,以此类推。
(2). 使用列名索引器
由于列名更容易记住,所以多数情况下,使用列名来进行索引
例如,存在FirstName和LastName两列数据:
while(rdr.Read())
{
txtValues.AppendText(rdr["FirstName"].ToString());
txtValues.AppendText(rdr["LastName"].ToString());
}
(3). 使用类型访问器方法
只要知道返回值的类型,就可以使用这种方法
如下查询语句
//Query
string sql1 = @"select CardType, CardNumber, ExpMonth, ExpYear from Sales.CreditCard";
while(rdr.Read())
{
txtTypeAccess.AppendText(rdr.GetString(0).PadRight(30));
txtTypeAccess.AppendText(rdr.GetString(1));
txtTypeAccess.AppendText(rdr.GetByte(2).ToString());
txtTypeAccess.AppendText(rdr.GetInt16(3).ToString());
}
2. 获取数据的信息
Depth:该属性表示当前行嵌套的深度
FieldCount:该属性表示当前行中的列数
GetDataTypeName:该方法接受索引并返回列数据类型的名称额字符串
GetFieldType:该方法接受索引并返回对象的.NET Framework类型
GetName:该方法接受索引并返回指定列的列名
GetOrdinal:该方法接受列名并返回列索引
GetSchemaTable:该方法返回列的元数据
HasRows:该属性表示数据读取器是否包含数据行
RecordsAffected:该属性表示已更新,插入或删除的数据行的数目
3. 获取表的数据
利用数据读取器的GetSchemaTable方法,表示对所查询的表的描述,以DataRow和DataColumn对象的形式包含行和列的集合。这些行和列由DataTable类的Rows和Columns属性以集合对象的形式返回。
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataReader rdr = cmd.ExecuteReader();
DataTable schema = rdr.GetSchemaTable();
//Display info from each row in the data table
foreach(DataRow row in schema.Rows)
{
foreach(DataColumn col in schema.columns)
{
txtSchema.AppendText(col.ColumnName + " = " + row[col]);
txtSchema.AppendText("\n");
}
txtSchema.AppendText("-----------------------");
}
4. 使用数据读取器处理多个结果集
有时想快点完成工作,同时使用两个或者多个查询。
例如要读取如下两条sql指令:
//Query1
string sql1 = @"select CountryRegionCode,Name
from Person.CountryRegion
where Name like 'A%' ";
//Query2
string sql2 = @"select FirstName, LastName
from Person.Contact";
//Combining queries to produce multiple result set
string sql = sql1 + sql2;
利用NextResult方法来处理多个结果集
do
{
txtResult.AppendText(rdr.GetName(0));
txtResult.AppendText("\t\t");
txtResult.AppendText(rdr.GetName(1));
txtResult.AppendText("\n");
txtResult.AppendText("".PadLeft(30, "="));
txtResult.AppendText("\n");
while(rdr.Read())
{
txtResult.AppendText(rdr[0].ToString());
txtResult.AppendText("\t\t");
txtResult.AppendText(rdr[1].ToString());
txtResult.AppendText("\n");
}
}