如何迭代IDataReader

时间:2015-04-07 14:05:08

标签: c# oracle entity-framework

我正在使用.Net 4.5,C#,Oracle 11g和EF 4.4.0.0

现有流程

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

现有代码

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的每一行,并将其映射到我们在应用程序中定义的Entity属性。目前,在数据表的每一行加载了IDataReader中的数据之后,这样做了。

我在寻找什么

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

正如您在上面所看到的,该过程循环遍历数据表中的每一行,成功地将每个记录映射到一个Entity对象并将其发回,这将被添加到Dictionary,{{1作为关键。

问题

我无法找到迭代EMPLOYEE_ID对象的方法,获取单个记录,然后通过dataReader完成整个过程,并使用{{BusinessObjectBuilder将其添加到Dictionary 1}}作为关键。

我们是否有办法以相同的方式或其他方式迭代IDataReader实例,就像我们使用DataTable一样?

1 个答案:

答案 0 :(得分:2)

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

while(dataReader.Read()) 
{
  var value1 = reader.GetValue(0); // first column
  var value2 = reader.GetValue(1); // second column
}

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