加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 用SqlDataReader foreach?

发布时间:2020-12-15 06:23:56 所属栏目:百科 来源:网络整理
导读:我有如下代码: SqlDataReader reader = getAddressQuery.sqlReader;while (reader.Read()){ foreach (Object ob in reader) { someText.InnerText = someText.InnerText + " " + ob.ToString(); }} foreach循环中的代码不执行.但是,我可以这样做: SqlDataR
我有如下代码:
SqlDataReader reader = getAddressQuery.sqlReader;
while (reader.Read())
{
    foreach (Object ob in reader)
    {
        someText.InnerText = someText.InnerText + " " + ob.ToString();
    }
}

foreach循环中的代码不执行.但是,我可以这样做:

SqlDataReader reader = getAddressQuery.sqlReader;
while (reader.Read())
{
    someText.InnerText = reader[0].ToString();
}

哪个工作.

显然,我可以使用常规的循环而不是foreach循环来实现相同的结果,但是我认为foreach语法更清晰,所以我可以使用它.

这里出了什么问题? c#中的foreach循环不像更高级语言那么灵活吗?

解决方法

像下面这样的东西请注意,IDataReader来自IDataRecord,它显示用于处理当前行的成员:
IEnumerable<IDataRecord> GetFromReader(IDataReader reader)
{
    while(reader.Read()) yield return reader;
}

foreach(IDataRecord record in GetFromReader(reader))
{
    ... process it ...
}

或者甚至类似于以下内容,从读者获取强类型实体对象的枚举或列表:

IEnumerable<T> GetFromReader<T>(IDataReader reader,Func<IDataRecord,T> processRecord)
{
    while(reader.Read()) yield return processRecord(reader);
}

MyType GetMyTypeFromRecord(IDataRecord record)
{
    MyType myType = new MyType();
    myType.SomeProperty = record[0];
    ...
    return myType;
}

IList<MyType> myResult = GetFromReader(reader,GetMyTypeFromRecord).ToList();

UPDATE响应Caleb Bell的评论.

我同意Enumerate是一个更好的名字.

事实上,在我的个人“常用”库中,我已经通过IDataReader上的扩展方法替换了上述内容:

public static IEnumerable<IDataRecord> Enumerate(this IDataReader reader)
{
    while (reader.Read())
    {
        yield return reader;
    }
}

调用者可以使用以下方式获取强类型的对象:

reader.Enumerate.Select(r => GetMyTypeFromRecord(r))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读