C# DataReader对象的用法(附带实例)
DataReader 对象是一个简单的数据集,它主要用于从数据源中读取只读的数据集,其常用于检索大量数据。
根据 .NET Framework 数据提供程序的不同,DataReader 对象可以分为 SqlDataReader、OleDbDataReader、OdbcDataReader 和 OracleDataReader 这 4 大类。
由于 DataReader 对象每次只能在内存中保留一行,所以使用它的系统开销非常小。
使用 DataReader 对象读取数据时,必须一直连接数据库,所以这种连接模式也被称为连线模式,其架构如下图所示(这里以 SqlDataReader 为例)。

图 1 使用 SqlDataReader 对象读取数据
DataReader 对象是一个轻量级的数据对象,如果只需要将数据读出并显示,那么它是最合适的工具,因为它的读取速度比后面要讲解到的 DataSet 对象要快,占用的资源也更少。但是,一定要铭记:DataReader 对象在读取数据时,要求数据库一直处于连接状态,只有在读取完数据之后才能断开连接。
开发人员可以通过 Command 对象的 ExecuteReader() 方法从数据源中检索数据来创建 DataReader 对象,DataReader 对象的常用属性及说明如下表所示:
DataReader 对象的常用方法及说明如下表所示:
【实例】获取编程词典信息并分列显示。创建一个 Windows 应用程序,在默认窗体中添加一个 RichTextBox 控件,用来显示使用 SqlDataReader 对象读取到的数据表中的数据,代码如下:

图 2 使用DataReader对象读取数据
根据 .NET Framework 数据提供程序的不同,DataReader 对象可以分为 SqlDataReader、OleDbDataReader、OdbcDataReader 和 OracleDataReader 这 4 大类。
由于 DataReader 对象每次只能在内存中保留一行,所以使用它的系统开销非常小。
使用 DataReader 对象读取数据时,必须一直连接数据库,所以这种连接模式也被称为连线模式,其架构如下图所示(这里以 SqlDataReader 为例)。

图 1 使用 SqlDataReader 对象读取数据
DataReader 对象是一个轻量级的数据对象,如果只需要将数据读出并显示,那么它是最合适的工具,因为它的读取速度比后面要讲解到的 DataSet 对象要快,占用的资源也更少。但是,一定要铭记:DataReader 对象在读取数据时,要求数据库一直处于连接状态,只有在读取完数据之后才能断开连接。
开发人员可以通过 Command 对象的 ExecuteReader() 方法从数据源中检索数据来创建 DataReader 对象,DataReader 对象的常用属性及说明如下表所示:
属性 | 说明 |
---|---|
HasRows | 判断数据库中是否有数据 |
FieldCount | 获取当前行的列数 |
RecordsAffected | 获取执行SQL语句所更改、添加或删除的行数 |
DataReader 对象的常用方法及说明如下表所示:
方法 | 说明 |
---|---|
Read | 使 DataReader 对象前进到下一条记录 |
Close | 关闭 DataReader 对象 |
Get | 用来读取数据集当前行某一列的数据 |
使用DataReader对象检索数据
使用 DataReader 对象读取数据时,首先需要使用其 HasRows 属性判断是否有数据可供读取,如果有数据,则返回 true,否则返回 false;然后使用 DataReader 对象的 Read() 方法来循环读取数据表中的数据;最后通过访问 DataReader 对象的列索引来获取读取到的值,例如,sqldr["ID"] 用来获取数据表中 ID 列的值。【实例】获取编程词典信息并分列显示。创建一个 Windows 应用程序,在默认窗体中添加一个 RichTextBox 控件,用来显示使用 SqlDataReader 对象读取到的数据表中的数据,代码如下:
private void Form1_Load(object sender, EventArgs e) { // 创建数据库连接对象 SqlConnection sqlcon = new SqlConnection("Server=XIAOKE;User Id=sa;Pwd=;Database=db_EMS"); // 创建SqlCommand对象 SqlCommand sqlcmd = new SqlCommand("select * from tb_PDic order by ID asc", sqlcon); if (sqlcon.State == ConnectionState.Closed) // 判断连接是否关闭 { sqlcon.Open(); // 打开数据库连接 } // 使用ExecuteReader方法的返回值创建SqlDataReader对象 SqlDataReader sqldr = sqlcmd.ExecuteReader(); richTextBox1.Text = "编号\t版本\t价格\n"; // 为文本框赋初始值 try { if (sqldr.HasRows) // 判断SqlDataReader对象中是否有数据 { while (sqldr.Read()) // 循环读取SqlDataReader对象中的数据 { richTextBox1.Text += "" + sqldr["ID"] + "\t" + sqldr["Name"] + "\t" + sqldr["Money"] + "\n"; // 显示读取的详细信息 } } } catch (SqlException ex) // 捕获数据库异常 { MessageBox.Show(ex.ToString()); // 输出异常信息 } finally { sqldr.Close(); // 关闭SqlDataReader对象 sqlcon.Close(); // 关闭数据库连接 } }程序运行结果为:

图 2 使用DataReader对象读取数据