有没有一种方便的方法可以使用 ADO .NET 将数据从单个列获取到集合中?
Posted
技术标签:
【中文标题】有没有一种方便的方法可以使用 ADO .NET 将数据从单个列获取到集合中?【英文标题】:Is there a convenient way to get data from a single column into a collection using ADO .NET? 【发布时间】:2014-02-13 15:59:40 【问题描述】:我需要一个 ID 列表。所以我有一个非常简单的SQL语句
SELECT FK_NormalizedKeyword FROM KeywordSpelling WHERE Spelling = @keywordspelling
它返回多行,但每行有一个值。
我知道如何使用阅读器或数据适配器通过 ADO .NET 获取数据。但在这种简单的情况下,这似乎有点过头了。我知道,如果我想要一个数字,我可以使用cmd.ExecuteScalar()
并在没有完整阅读器的情况下获取值。有什么东西可以让我使用同样简洁的代码将数据库中单个列的结果放入一个空集合中?
【问题讨论】:
您可以让您的查询返回一个以逗号分隔的 ID 列表,然后使用ExecuteScalar
- 但 那 将是一个矫枉过正。使用DataReader
是最快且资源负载最小的方式
DataReader 没有那么重,可以避免它。
没有类似的内置方法,但如果它对您来说足够常见,那么您可以轻松地为其创建扩展方法。像cmd.ExecuteList<T>()
这样的东西需要一个列,将结果转换为T
,并返回IEnumerable<T>
。
【参考方案1】:
Dapper:
string keywordspelling = ...;
var list = conn.Query<string>(
@"SELECT FK_NormalizedKeyword
FROM KeywordSpelling WHERE Spelling = @keywordspelling",
new keywordspelling ).ToList();
(注意我假设FK_NormalizedKeyword
是一个类似字符串的字段;如果是整数,请将<string>
替换为<int>
)
这也适用于 POCO 的复杂数据填充,例如:
var orders = conn.Query<Order>(
"SELECT * FROM Order WHERE Region=@Region",
new region ).ToList();
(这里假设一个直接的列名/成员名映射)
【讨论】:
【参考方案2】:简答。没有
长答案。您可以将值连接到响应中的单个字段中,但仍需要返回结果集。
【讨论】:
【参考方案3】:不是在一个语句中,而是一个简单的循环:
while(dr.Read())
list.Add(dr.GetInt32(0));
【讨论】:
【参考方案4】:您必须使用DataReader
逐条检索数据。然后您可以使用循环来填充集合。这是最有效的方法,因为它按需填充。但是,您可以使用 DataAdapter
隐藏此循环以填充 DataTable
:
DataTable tblKeyWords = new DataTable();
using(var con = new SqlConnection("..."))
using(var da = new SqlDataAdapter("SELECT FK_NormalizedKeyword FROM KeywordSpelling WHERE Spelling = @keywordspelling", con))
da.SelectCommand.Parameters.AddWithValue("@keywordspelling", "...");
da.Fill( tblKeyWords );
DataAdapters and DataReaders
结果在查询执行时返回,并存储在 客户端上的网络缓冲区,直到您使用 Read 请求它们 DataReader 的方法。使用 DataReader 可以增加 通过立即检索数据来提高应用程序性能 可用,并且(默认情况下)在内存中一次只存储一行, 减少系统开销。
【讨论】:
以上是关于有没有一种方便的方法可以使用 ADO .NET 将数据从单个列获取到集合中?的主要内容,如果未能解决你的问题,请参考以下文章