3

我有一个简单的问题,尽管在谷歌上搜索了很多,但我还是找不到答案。也许张贴这个问题会帮助下一个寻找相同答案的可怜人。

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

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

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

解决此问题的最佳做法是什么?如何解决此问题?

4

4 回答 4

6

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

于 2012-06-19T16:16:45.717 回答
3

执行标量

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

您需要使用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
     }
}
于 2012-06-19T16:16:37.493 回答
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;
}
于 2012-06-19T16:16:24.113 回答
2

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

如果您想要一个项目列表,您应该使用ExecuteReader并循环通过阅读器并阅读所需的值

List<int> items=new List<int>();
using (IDataReader reader = db.ExecuteReader(dbCommand))
{
      while (reader.Read())
      {
         items.Add(reader.GetInt32(reader.GetOrdinal("YourColumnName"));
      }
}
于 2012-06-19T16:18:35.353 回答