C# 如何迭代IDataReader
我正在使用.Net 4.5、C、Oracle 11g和EF 4.4.0.0 现有流程 因此,我们有一个数据模型,它类似于底层数据库结构,并在应用程序中作为类创建适当的实体对象。我们并不总是使用EF加载数据,因为有时我们使用存储过程将数据加载到客户端,然后在应用程序中逐个记录实体类映射数据记录 现行守则C# 如何迭代IDataReader,c#,oracle,entity-framework,C#,Oracle,Entity Framework,我正在使用.Net 4.5、C、Oracle 11g和EF 4.4.0.0 现有流程 因此,我们有一个数据模型,它类似于底层数据库结构,并在应用程序中作为类创建适当的实体对象。我们并不总是使用EF加载数据,因为有时我们使用存储过程将数据加载到客户端,然后在应用程序中逐个记录实体类映射数据记录 现行守则 var dataTable = new DataTable(); var accounts = new Dictionary<Decimal, ApplicationDomain.MainV
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类获取员工的每一行,并将其与我们在应用程序中定义的实体属性进行映射。目前,在从IDataReader加载数据后,正在对数据表的每一行执行此操作
我在找什么
我们希望摆脱DataTable从读卡器加载数据的部分。我希望直接使用BusinessObjectBuilder处理dataReader对象中的行/记录,并将其映射到相应的实体属性
如上所述,流程循环遍历datatable中的每一行,成功地将每条记录映射到实体对象并将其发送回,该实体对象将添加到字典中,并使用EMPLOYEE_ID作为键
问题
我找不到一种方法来遍历dataReader对象,获取单个记录,然后通过BusinessObjectBuilder执行正在执行的流程,将其添加到字典中,并将EMPLOYEE_ID作为键
是否有任何方法可以像使用DataTable一样迭代IDataReader实例?使用该方法读取下一条记录,并从列中获取值:
while(dataReader.Read())
{
var value1 = reader.GetValue(0); // first column
var value2 = reader.GetValue(1); // second column
}
我会向BusinessObjectBuilder添加重载以从IDataReader读取,而不是替换DataTable方法,以备将来需要。@D Stanley,我不想更改BusinessObjectBuilder进程。它只接受数据行,不能重载进程。我必须传递一条记录…@SaagarEliasJacky数据读取器不包含DataRow对象-如果您想要有数据行,您需要加载一个数据表。选择你的毒药。。。