C# 关于IDataReader 学习

16 阅读2分钟

在 C# 中,IDataReader 是一个重要的接口,它提供了一种从数据源读取数据的方式,通常用于从数据库中读取数据。以下是对 IDataReader 的详细解释:

基本概念

  • IDataReader 是 System.Data 命名空间下的一个接口,它定义了一个可以从数据源读取数据的对象。
  • 它提供了一种只进的、只读的数据流,这意味着你可以逐行读取数据,并且只能向前移动,不能向后移动或修改数据。

常用方法和属性

  • 方法

    • Read():该方法将 IDataReader 前进到下一行,如果有更多行可用,返回 true;如果没有更多行,返回 false
    • Close():关闭 IDataReader 对象,释放与之关联的资源。
    • GetXXX(int ordinal) 或 GetXXX(string name):用于从当前行中获取数据,其中 XXX 可以是 Int32StringBoolean 等数据类型,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 语句确保资源的正确释放,避免资源泄漏。