我有一个简单的问题,即使谷歌搜索很多,我也无法找到答案。或许发布这个问题将有助于下一个寻找相同答案的可怜的灵魂。
我有一个返回不同ID的集合的查询。
我正在使用此查询创建SQLCommand
并使用ExecuteScalar( )
来运行它。
ExecuteScalar( )
似乎返回一个对象,不允许我将其强制转换为List。
解决此问题的最佳做法是什么?如何解决此问题?
答案 0 :(得分:6)
执行标量返回单个数据。想一行,一列。如果要返回集合,则需要致电ExecuteReader()
。这将返回IDataReader
。然后,您可以迭代记录并返回列表。
答案 1 :(得分: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
}
}
答案 2 :(得分: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;
}
答案 3 :(得分: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"));
}
}