Generic data fetch with IDataReader
-
Hi there, I'm looking for some advise for a generic data fetch pattern for IDataReader I'm working on, as follow: // main load using(GenericDataReader reader = new GenericDataReader(cm.ExecuteReader())) { while (reader.Read()) { orders.Add(reader.Get<Order>()); // "GetList" pattern //return new Order(reader); // "Get" pattern } } // generic reader; interface implementation removed public class GenericDataReader : IDataReader { // ... \\ public T Get<T>(string name) { int i = _dataReader.GetOrdinal(name); if (_dataReader.IsDBNull(i)) return default(T); else return (T)_dataReader.GetValue(i); } public T Get<T>() where T : ILoadable, new() { T entity = new T(); entity.Load(this, false); return entity; } } // All business objects must implements this interface public interface ILoadable { void Load(GenericDataReader reader, bool deep); } // Sample business object class Order : ILoadable { int id; Customer customer; // Note DateTime orderDate; DateTime requiredDate; DateTime? shippedDate; List<OrderDetail> orderDetails; public Order(){ } public Order(GenericDataReader reader) { Load(reader, true); } #region ILoadable Members public void Load(GenericDataReader reader, bool deep) { id = reader.Get<int>("OrderID"); customer = reader.Get<Customer>(); // Note orderDate = reader.Get<DateTime>("OrderDate"); requiredDate = reader.Get<DateTime>("OrderRequiredDate"); shippedDate = reader.Get<DateTime?>("OrderShippedDate"); if (deep && reader.NextResult()) { orderDetails = new List<OrderDetail>(); while (reader.Read()) { orderDetails.Add(reader.Get<OrderDetail>()); } } } #endregion } What do you think? Are there any major drawback with this model I'm missing? Are there any more clever way to do that? I really appreciate your time reading this. Thanks in advance, Rubens
-
Hi there, I'm looking for some advise for a generic data fetch pattern for IDataReader I'm working on, as follow: // main load using(GenericDataReader reader = new GenericDataReader(cm.ExecuteReader())) { while (reader.Read()) { orders.Add(reader.Get<Order>()); // "GetList" pattern //return new Order(reader); // "Get" pattern } } // generic reader; interface implementation removed public class GenericDataReader : IDataReader { // ... \\ public T Get<T>(string name) { int i = _dataReader.GetOrdinal(name); if (_dataReader.IsDBNull(i)) return default(T); else return (T)_dataReader.GetValue(i); } public T Get<T>() where T : ILoadable, new() { T entity = new T(); entity.Load(this, false); return entity; } } // All business objects must implements this interface public interface ILoadable { void Load(GenericDataReader reader, bool deep); } // Sample business object class Order : ILoadable { int id; Customer customer; // Note DateTime orderDate; DateTime requiredDate; DateTime? shippedDate; List<OrderDetail> orderDetails; public Order(){ } public Order(GenericDataReader reader) { Load(reader, true); } #region ILoadable Members public void Load(GenericDataReader reader, bool deep) { id = reader.Get<int>("OrderID"); customer = reader.Get<Customer>(); // Note orderDate = reader.Get<DateTime>("OrderDate"); requiredDate = reader.Get<DateTime>("OrderRequiredDate"); shippedDate = reader.Get<DateTime?>("OrderShippedDate"); if (deep && reader.NextResult()) { orderDetails = new List<OrderDetail>(); while (reader.Read()) { orderDetails.Add(reader.Get<OrderDetail>()); } } } #endregion } What do you think? Are there any major drawback with this model I'm missing? Are there any more clever way to do that? I really appreciate your time reading this. Thanks in advance, Rubens
Seems a nice idea. Just when you are done, try to post a article on CodeProject. Good Luck, Mehroz
-
Seems a nice idea. Just when you are done, try to post a article on CodeProject. Good Luck, Mehroz
Hi Mehroz, I'm working on some model limitations and, when I ready to go, I'll post @ CP, for sure. Thanks for your incentive, Rubens