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");
    }
}

 

02-25 01:25