首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何遍历IDataReader

如何遍历IDataReader
EN

Stack Overflow用户
提问于 2015-04-07 14:05:07
回答 1查看 1.6K关注 0票数 0

我使用的是.Net 4.5、C#、Oracle11g和EF 4.4.0.0

现有进程

因此,我们有一个类似于底层数据库结构的DataModel和应用程序中作为类创建的适当实体对象。我们并不总是使用EF加载数据,因为有时我们使用存储过程将数据加载到客户端,然后通过记录应用程序中的实体类来映射数据记录。

现有代码

代码语言:javascript
复制
var dataTable = new DataTable();
var accounts = new Dictionary<Decimal, ApplicationDomain.MainView.EMPLOYEE_MASTER>();

using (var cmd = new OracleCommand("PKG_TEST.GetAllEmployees", (OracleConnection)Db.Connection))
{
    cmd.Parameters.Add(new OracleParameter("DEPT_ID", userBankId));
    cmd.Parameters.Add(new OracleParameter("EMPLOYEE_P", OracleDbType.RefCursor, 0, ParameterDirection.Output, true, 0, 0, string.Empty, DataRowVersion.Default, Convert.DBNull));
    cmd.CommandType = CommandType.StoredProcedure;

    Db.Open();
    using (IDataReader dataReader = cmd.ExecuteReader())
    {
        try
        {
            dataTable.Load(dataReader );

            foreach (BusinessObjectBuilder<ApplicationDomain.MainView.EMPLOYEE_MASTER> employeeBuilder in
                dataTable.Rows.Cast<DataRow>().Select(row => new BusinessObjectBuilder<ApplicationDomain.MainView.EMPLOYEE_MASTER>(row)).Where(
                        accountBuilder => ((IBusinessObjectBuilder<ApplicationDomain.MainView.EMPLOYEE_MASTER>)employeeBuilder).Value != null))
            {
                var employee = ((IBusinessObjectBuilder<ApplicationDomain.MainView.EMPLOYEE_MASTER>)employeeBuilder).Value;
                try
                {
                    if (!employees.ContainsValue(employee))
                    {
                        employees.Add(employee.EMPLOYEE_ID, employee);
                    }
                    else
                    {
                        _log.InfoFormat("Employee ID already exists for this Department : Employee Id{0}", employee.EMPLOYEE_ID);
                    }
                }
                catch { }
            }
        }
        finally
        {
            if (dataReader != null && !dataReader.IsClosed)
            {
                dataReader.Close();
            }
        }
    }
}

BusinessObjectBuilder类接受每一行EMPLOYEE,并将其与我们在应用程序中定义的实体属性进行映射。目前正在对数据表的每一行执行此操作,在从IDataReader加载其数据之后。

我在找什么

我们希望摆脱DataTable正在装载来自阅读器的数据的部分。我想直接使用BusinessObjectBuilder与来自dataReader对象的行/记录,并将其映射到相应的实体属性。

正如您在上面看到的,流程循环遍历datatable中的每一行,成功地将每条记录映射到一个实体对象中,并将其发送回Dictionary,该对象将被添加到一个EMPLOYEE_ID作为键。

问题

我无法找到一种方法来迭代dataReader对象,获取单独的记录,然后通过BusinessObjectBuilder执行正在完成的过程,并将其添加到Dictionary中,并以EMPLOYEE_ID作为键。

有什么方法可以像我们使用IDataReader一样,以同样的方式或其他方式迭代一个DataTable实例吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-07 14:09:41

使用Read方法读取下一条记录,使用GetValue从列中获取值:

代码语言:javascript
复制
while(dataReader.Read()) 
{
  var value1 = reader.GetValue(0); // first column
  var value2 = reader.GetValue(1); // second column
}

我会将重载添加到BusinessObjectBuilder中,以便从IDataReader中读取,而不是替换DataTable方法(以防将来需要它们)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29493533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档