在 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
语句确保资源的正确释放,避免资源泄漏。