我有一个简单的问题,尽管进行了大量的谷歌搜索,但仍然找不到答案。也许发布这个问题会帮助下一个寻找相同答案的可怜人。
我有一个查询返回一组不同的ID。
我正在使用此查询创建一个SQLCommand
并使用ExecuteScalar( )
运行它。
ExecuteScalar( )
似乎返回一个对象,并且不允许我将其强制转换为List。
最佳实践是什么以及如何解决这个问题?
我有一个简单的问题,尽管进行了大量的谷歌搜索,但仍然找不到答案。也许发布这个问题会帮助下一个寻找相同答案的可怜人。
我有一个查询返回一组不同的ID。
我正在使用此查询创建一个SQLCommand
并使用ExecuteScalar( )
运行它。
ExecuteScalar( )
似乎返回一个对象,并且不允许我将其强制转换为List。
最佳实践是什么以及如何解决这个问题?
执行标量返回单个数据。想象一行,一列。如果你想要返回一个集合,你需要调用ExecuteReader()
。这将返回一个IDataReader
。然后,您可以迭代记录并返回列表。
执行查询,并返回查询结果集中第一行的第一列。忽略其他列或行。
您需要使用 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
}
}
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;
}
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"));
}
}