c# - 从SqlDataReader填充通用列表

Eri*_*rik 11 c# sql sqldatareader

如何添加SqlDataReader返回通用List的值?我有一个方法,我SqlDataReader用来CategoryIDCategory表中获取.我想添加所有CategoryID通用列表.

这个剂量不起作用,因为它只返回一个categoryID,这是最后一个.我想将所有内容添加categoryID到列表中,然后返回它们.

我怎么做?

SqlConnection connection = null;
SqlDataReader reader = null;
SqlCommand cmd = null;

try
{
    connection = new SqlConnection(connectionString);
    cmd = new SqlCommand("select CategoryID from Categories", connection );

    connection.Open();

    List<int> catID = new List<int>();
    dr = cmd.ExecuteReader();
    while (dr.Read())
    {
        catID.Add(Convert.ToInt32(dr["CategoryID"].ToString()));
    }
}
finally
{
    if (connection  != null)
        connection.Close();
}
return catID;
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 15

尝试这样,它更好,更安全,使用延迟加载,更少的代码,工作,...:

public IEnumerable<int> GetIds()
{
    using (var connection = new SqlConnection(connectionString))
    using (var cmd = connection.CreateCommand())
    {
        connection.Open();
        cmd.CommandText = "select CategoryID from Categories";
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                yield return reader.GetInt32(reader.GetOrdinal("CategoryID"));
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

List<int> catIds = GetIds().ToList();
Run Code Online (Sandbox Code Playgroud)

  • @BrokenGlass没有.连接,读者,一旦foreach退出,所有这些东西都会被关闭.除了这样做的优点之外,如果你必须重新使用IEnumerable中的对象并且你还没有将它们全部存储在某个地方,那么调用者将不得不重新读取数据库中的数据.我的意思是,如果你没有完全"预先".使用`ToList()`你已经将它们放在某个地方.. (2认同)

Bro*_*ass 3

您当前的代码应该可以工作,假设catID确实在 try 块之前声明,否则将无法编译。

  • @Erik:您可以使用您正在运行的*真实*代码更新您的示例代码吗?您可能每次都会更新列表,但上面的代码显然不是您当前使用的代码。 (2认同)