代码之家  ›  专栏  ›  技术社区  ›  ristonj

从SqlDataReader填充数组(或arraylist)

  •  23
  • ristonj  · 技术社区  · 16 年前

    7 回复  |  直到 16 年前
        1
  •  54
  •   Pavel Minaev    16 年前

    这是可能的。在.NET 2.0+中, SqlDataReader 继承自 DbDataReader ,它实现 IEnumerable (非泛型)。这意味着您可以使用LINQ:

    List<string> list = (from IDataRecord r in dataReader
                         select (string)r["FieldName"]
                        ).ToList();
    

    也就是说,循环仍然存在,只是隐藏在 Enumerable.Select ,而不是在代码中显式显示。

        2
  •  13
  •   Russ Cam    16 年前

    SqlDataReader 是来自SQL Server数据库的只读行流,该行流将在代码中显式循环或在框架实现中隐藏(例如DataTable的 Load 方法)。

    听起来,使用一个通用列表,然后将列表作为数组返回是一个不错的选择。例如

    List<int> list = new List<int>();
    
    using (SqlDataReader reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
             list.Add(reader.GetInt32(0));
        }    
    }
    return list.ToArray();
    

    List<T> ReadOnlyCollection<T> )更有用吗?

        3
  •  6
  •   JNF    13 年前

    SqlDataReader the following method :

    int size;
    object[] data = new object[]{};
    size = reader.GetValues(data);
    

    data 使用当前读卡器行的值,将放入数组的对象数指定为大小。

        4
  •  4
  •   Andrew Hare    16 年前

    既然有 IDataReader 实施( SqlDataReader 包含)根据定义将是一个只向前的阅读器,没有循环就没有办法做到这一点。即使有一个框架库方法来实现这一点,它也必须像您一样在阅读器中循环。

        5
  •  1
  •   RickIsWright    12 年前

    原始OP请求数组、ArrayList或List。您也可以返回数组。只需调用.ToArray()方法并将其分配给以前声明的数组。数组在枚举每个元素时非常快。如果列表包含1000多个元素,则比列表快得多。

    ids_array = (from IDataRecord r in idReader 
    select (string)r["ID"]).ToArray<string>();  
    

    另外,如果您正在使用键的查找,您可以考虑创建一个具有出色查找性能的HASSET对象,如果您只需检查一个列表与另一个列表,以确定哈希集对象中是否存在元素键。 例子:

     HashSet<string> hs = new HashSet<string>( 
    (from IDataRecord r in idReader select (string)r["ID"]).AsEnumerable<string>() );
    
        6
  •  0
  •   Chris Brandsma    16 年前

    您必须循环,但有些项目可以使其更简单。另外,尽量不要使用ArrayList,而是使用List。

    您可以在FluentAdo中签出一个: http://fluentado.codeplex.com

        public IList<UserAccount> List()
        {
            var list = new FluentCommand<UserAccount>("SELECT ID, UserName, Password FROM UserAccount")
                .SetMap(reader => new UserAccount
                {
                    ID = reader.GetInt("ID"),
                    Password = reader.GetString("Password"),
                    UserName = reader.GetString("UserName"),
                })
                .AsList();
    
            return list;
        }
    
        7
  •  0
  •   Community Mohan Dere    6 年前

    DataTable dt as DataTable; 
    dt.fill(data);
    

    System.Data.DataSetExtensions 如Joel Muller对此的回答所述 question.

    In使用了一点Linq,因此您将使用net.net 3.5或更高版本。

        8
  •  -1
  •   Suraj Rao Raas Masood    5 年前
    var array = reader.GetValue("field_name") as long[];