我有一个简单的问题,尽管在谷歌上搜索了很多,但我还是找不到答案。也许张贴这个问题会帮助下一个寻找相同答案的可怜人。
我有一个返回不同 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
并循环通过阅读器并阅读所需的值
List<int> items=new List<int>();
using (IDataReader reader = db.ExecuteReader(dbCommand))
{
while (reader.Read())
{
items.Add(reader.GetInt32(reader.GetOrdinal("YourColumnName"));
}
}