从数据库返回List<int>

3

我有一个简单的问题,尽管进行了大量的谷歌搜索,但仍然找不到答案。也许发布这个问题会帮助下一个寻找相同答案的可怜人。

我有一个查询返回一组不同的ID。

我正在使用此查询创建一个SQLCommand并使用ExecuteScalar( )运行它。

ExecuteScalar( )似乎返回一个对象,并且不允许我将其强制转换为List。

最佳实践是什么以及如何解决这个问题?

4个回答

6

执行标量返回单个数据。想象一行,一列。如果你想要返回一个集合,你需要调用ExecuteReader()。这将返回一个IDataReader。然后,您可以迭代记录并返回列表。


3

ExecuteScalar

执行查询,并返回查询结果集中第一行的第一列。忽略其他列或行

您需要使用 SqlDataReader

SqlCommand command = new SqlCommand(queryString, connection);
IList<int> ints = new List<int>();
using(SqlDataReader reader = command.ExecuteReader()) {
     while (reader.Read())
     {
         ints.add(reader.GetInt32(0)); // provided that first (0-index) column is int which you are looking for
     }
}

2

ExecuteScalar() - 返回仅第一行和第一列的结果...

查看msdn:SqlCommand.ExecuteScalar

如果您需要获取结果,您需要使用像ExecuteReader这样的方法。

 using (IDataReader reader = 
        command.ExecuteReader(CommandBehavior.CloseConnection))
 {
      List<int> intlist = ReadList(reader);
 }

创建列表的方法

List<int> ReadList(IDataReader reader)
{
    List<int> list = new List<int>();
    int column = reader.GetOrdinal("MyColumn");

    while (reader.Read())
    {
        //check for the null value and than add 
        if(!SqlReader.IsDBNull(column))
             list.Add(reader.GetInt32(column));
    }

    return list;
}

如果返回一个空的数据库值,这将抛出异常。 - Jason Meckley
@JasonMeckley - 感谢您指出问题,我刚刚改进了代码............ - Pranay Rana
没问题。我在不止一次的情况下遇到过这个问题。 - Jason Meckley

2

ExecuteScalar方法返回查询结果集中第一行第一列的值。其它列和行将被忽略。

如果你需要获取多行数据,应该使用ExecuteReader方法,遍历SqlDataReader对象来读取需要的值。

List<int> items=new List<int>();
using (IDataReader reader = db.ExecuteReader(dbCommand))
{
      while (reader.Read())
      {
         items.Add(reader.GetInt32(reader.GetOrdinal("YourColumnName"));
      }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接