C#数据库入门-012:数据读取器

一:概述
    数据读取器是实现了System.Data.IDataReader接口的对象,它是快速的,未缓存的,仅向前的,只读的,已连接数源的,逐行检索数据的数据流。它在遍历结果集时,一次只能读取一行。
    数据读取器不能直接被实例化,而要通过执行命令对象的ExecuteReader方法创建它的实例。

二:ExecuteReader和SqlDataReader
    SqlConnection conn = null;
    SqlDataReader rdr = null;
    try
    {
        conn = new SqlConnection(@"
            server=./sqlexpress; integrated security=true; database=northwind");

        //SqlCommand cmd = new SqlCommand();
        //cmd.Connection = conn;
        //cmd.CommandText = @"select count(*) from employees";
        SqlCommand cmd = new SqlCommand(@"select firstname , lastname from employees", conn);

        conn.Open();

        SqlDataReader rdr = cmd.ExecuteReader();
        while (rdr.Read())
        {
            Console.WriteLine("{0},/t{1}", rdr.GetValue(0), rdr.GetValue(1));
        }
    }
    catch (SqlException ex)
    {
        Console.WriteLine(ex.ToString());
    }
    finally
    {
        if (conn != null)
        {
            conn.Close();
        }
        if (rdr != null)
        {
            rdr.Close();
        }
    }
    1: ExecuteReader不仅创建了数据读取器,它还将SQL发送到相应的连接并加以执行。执行完毕后就可以遍历结果集的每一行,并逐列检索值。
        所以需要调用SqlDataReader的Read方法,如果存在下一行,该方法返回TRUE,并向前移动游标;否则返回FALSE。
    2: 为了能够把连接用于另一目的,或者在数据上执行另一个查询,调用SqlDataReader的Close方法很重要。
        由于一旦把读取器附着到活动的连接上,连接就会一忙于为读取器获取数据,而不能用于另一个目的,知道断开读取器为止。
    3: 使用序数索引器也可以读取数据
        while (rdr.Read())
        {
            Console.WriteLine("{0},/t{1}", rdr[0].ToString(), rdr[1].ToString());
        }
    4: 使用列名索引器
        while (rdr.Read())
        {
            Console.WriteLine("{0},/t{1}", rdr["firstname"].ToString(), rdr["lastname"].ToString());
        }
    5: 类型访问器,速度快
        while (rdr.Read())
        {
            Console.WriteLine("{0},/t{1}", rdr.GetString(0), rdr.GetString(1));
        }
        类似的还有GetInt64, GetBytes, GetBoolean, GetString, GetDateTime, GetDecimal等。

三:获取数据信息
    Console.WriteLine(rdr.FieldCount.ToString());
    类似的还有Depth, FieldCount, GetDataTypeName, GetFieldType, GetName, GetOrdinal, GetSchemaTable, HasRows, RecordsAffected

四:获取表的数据模式
    //Returns a DataTable that describes the column metadata of the SqlDataReader.
    DataTable schema = rdr.GetSchemaTable();
    foreach (DataRow dr in schema.Rows)
    {
        foreach (DataColumn col in schema.Columns)
            Console.WriteLine(col.ColumnName + " = " + dr[col]);
        Console.WriteLine("-----------------");
    }

你可能感兴趣的:(C#数据库入门-012:数据读取器)