在 C# 中,IDataReader 是一个重要的接口,它提供了一种从数据源读取数据的方式,通常用于从数据库中读取数据。以下是对 IDataReader 的详细解释:
基本概念
IDataReader是System.Data命名空间下的一个接口,它定义了一个可以从数据源读取数据的对象。- 它提供了一种只进的、只读的数据流,这意味着你可以逐行读取数据,并且只能向前移动,不能向后移动或修改数据。
常用方法和属性
-
方法:
Read():该方法将IDataReader前进到下一行,如果有更多行可用,返回true;如果没有更多行,返回false。Close():关闭IDataReader对象,释放与之关联的资源。GetXXX(int ordinal)或GetXXX(string name):用于从当前行中获取数据,其中XXX可以是Int32、String、Boolean等数据类型,ordinal是列的索引,name是列的名称。
-
属性:
FieldCount:获取当前行中的列数。IsClosed:指示IDataReader是否关闭。
示例代码:使用 ADO.NET 和 IDataReader 从 SQL Server 读取数据
using System;
using System.Data.SqlClient;
class Program
{
static void Main()
{
string connectionString = "Data Source=(local);Initial Catalog=YourDatabase;Integrated Security=True";
string query = "SELECT * FROM YourTable";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand(query, connection))
{
using (IDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
int id = reader.GetInt32(0);
string name = reader.GetString(1);
Console.WriteLine($"ID: {id}, Name: {name}");
}
}
}
}
}
}
代码解释
-
首先,我们定义了一个
connectionString,用于连接到 SQL Server 数据库。 -
然后,定义了一个
query,用于从数据库中查询数据。 -
创建
SqlConnection对象并打开连接。 -
使用
SqlCommand对象执行查询。 -
使用
command.ExecuteReader()获取IDataReader对象。 -
在
while循环中,使用reader.Read()逐行读取数据:reader.GetInt32(0)获取第一列的数据(假设第一列是int类型)。reader.GetString(1)获取第二列的数据(假设第二列是string类型)。
另一种获取数据的方式:使用列名
using System;
using System.Data.SqlClient;
class Program
{
static void Main()
{
string connectionString = "Data Source=(local);Initial Catalog=YourDatabase;Integrated Security=True";
string query = "SELECT * FROM YourTable";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand(query, connection))
{
using (IDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
int id = (int)reader["ID"];
string name = (string)reader["Name"];
Console.WriteLine($"ID: {id}, Name: {name}");
}
}
}
}
}
}
代码解释
- 与前面的代码类似,但使用
reader["ID"]和reader["Name"]来获取数据,这里ID和Name是列名。 - 需要注意的是,从
reader["columnName"]获取的数据是object类型,需要进行强制类型转换。
处理 DBNull 值
using System;
using System.Data.SqlClient;
class Program
{
static void Main()
{
string connectionString = "Data Source=(local);Initial Catalog=YourDatabase;Integrated Security=True";
string query = "SELECT * FROM YourTable";
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
using (SqlCommand command = new SqlCommand(query, connection))
{
using (IDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
int id = reader.IsDBNull(0)? 0 : reader.GetInt32(0);
string name = reader.IsDBNull(1)? "N/A" : reader.GetString(1);
Console.WriteLine($"ID: {id}, Name: {name}");
}
}
}
}
}
}
代码解释
reader.IsDBNull(ordinal)用于检查指定列是否为DBNull。- 如果列是
DBNull,可以提供一个默认值(如0或"N/A"),否则使用reader.GetXXX(ordinal)获取数据。
总结
IDataReader是一个重要的接口,用于从数据源(如数据库)读取数据。- 它提供了
Read()方法来逐行读取数据,以及各种GetXXX()方法来获取不同类型的数据。 - 可以使用列索引或列名来获取数据,并且要注意处理
DBNull值。 - 使用
using语句确保资源的正确释放,避免资源泄漏。