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对象读取数据
ICP备案:
公安联网备案: