是否有一种方法可以通过SqlDataReader(或任何其他C# ADO.NET对象)填充数组而无需循环遍历所有项?我有一个返回单列的查询,想将其放入字符串数组(或ArrayList、List等)中。
是可以的。 在.NET 2.0+中,SqlDataReader
继承自DbDataReader
,后者实现了非泛型的IEnumerable
。这意味着您可以使用LINQ:
List<string> list = (from IDataRecord r in dataReader
select (string)r["FieldName"]
).ToList();
话虽如此,循环仍然存在,只是它被隐藏在 Enumerable.Select
中,而不是明确出现在你的代码中。
SqlDataReader
是从SQL Server数据库中读取行的只向前只读流,无论是在代码中显式循环还是隐藏在框架实现中(例如DataTable的Load
方法),行的流都将被循环遍历。List<int> list = new List<int>();
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
list.Add(reader.GetInt32(0));
}
}
return list.ToArray();
回应您的评论,调用ToArray()可能会增加开销,这取决于情况。您是否需要一个对象数组来处理,还是通用集合(例如 List<T>
或 ReadOnlyCollection<T>
)更有用?
自 .NET 1.1 起,SqlDataReader
就有了以下方法:getvalues。
int size;
object[] data = new object[]{};
size = reader.GetValues(data);
此代码将当前读取行的值填充到data
中,并将放入数组的对象数量分配给size
。
object [] data = new object [reader.FieldCount];
- Nando由于任何IDataReader
实现(包括SqlDataReader
)都是按顺序读取的,因此没有办法在不循环的情况下完成此操作。即使有一个框架库方法来完成这个任务,它也必须像您一样通过读取器循环。
ids_array = (from IDataRecord r in idReader
select (string)r["ID"]).ToArray<string>();
HashSet<string> hs = new HashSet<string>(
(from IDataRecord r in idReader select (string)r["ID"]).AsEnumerable<string>() );
你需要循环,但有些项目可以使它更简单。此外,请尽量不要使用ArrayList,而是使用List。
你可以尝试使用FluentAdo:http://fluentado.codeplex.com
public IList<UserAccount> List()
{
var list = new FluentCommand<UserAccount>("SELECT ID, UserName, Password FROM UserAccount")
.SetMap(reader => new UserAccount
{
ID = reader.GetInt("ID"),
Password = reader.GetString("Password"),
UserName = reader.GetString("UserName"),
})
.AsList();
return list;
}
如果你将SqlDataAdapter读入到一个DataTable中:
DataTable dt as DataTable;
dt.fill(data);
然后,您可以使用Joel Muller在问题中提到的System.Data.DataSetExtensions
中的一些工具。
它使用了一些Linq,因此您需要使用 .Net 3.5或更高版本。
var array = reader.GetValue("field_name") as long[];
var
声明变量,因为没有办法描述类型),或者元组实例的列表,或者您自己的结构/类。匿名类通常最容易,例如:var list = (from IDataRecord r in dataReader select new { FieldName1 = (string)r["FieldName1"], FieldName2 = (string)r["FieldName2"] }).ToList();
- Pavel MinaevdataReader.Cast<IDataRecord>().Select(r => (string)r["FieldName"]).ToList()
- Pavel Minaevusing System.Linq;
。 - Kai Hartmann