Click here to Skip to main content
15,904,023 members
Home / Discussions / C#
   

C#

 
GeneralSend "Hello Notepad" to Notepad Pin
M Riaz Bashir19-Mar-08 20:09
M Riaz Bashir19-Mar-08 20:09 
GeneralRe: Send "Hello Notepad" to Notepad Pin
N a v a n e e t h19-Mar-08 20:19
N a v a n e e t h19-Mar-08 20:19 
GeneralPrint Dialog Problem Pin
D i x y19-Mar-08 18:45
D i x y19-Mar-08 18:45 
QuestionTrouble Retrieving Coordinates Pin
123shailesh19-Mar-08 18:40
123shailesh19-Mar-08 18:40 
GeneralRe: Trouble Retrieving Coordinates Pin
Christian Graus19-Mar-08 23:18
protectorChristian Graus19-Mar-08 23:18 
GeneralCreat ascii font Pin
kamalesh574319-Mar-08 17:23
kamalesh574319-Mar-08 17:23 
GeneralRe: Creat ascii font Pin
Guffa19-Mar-08 23:05
Guffa19-Mar-08 23:05 
GeneralGeneric data fetch with IDataReader [modified] Pin
RubensFarias19-Mar-08 16:37
RubensFarias19-Mar-08 16:37 
Hi there,

I'm looking for some advise for a generic data fetch pattern for IDataReader I'm working on, as follow:

C#
// 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. As long we come to a conclusion I'll write an article for CP with that we learned about it.

TIA,

Rubens

EDIT: Added formatting

modified on Thursday, March 20, 2008 6:44 AM

GeneralRe: Generic data fetch with IDataReader Pin
mmikey719-Mar-08 22:16
mmikey719-Mar-08 22:16 
GeneralRe: Generic data fetch with IDataReader Pin
RubensFarias20-Mar-08 0:47
RubensFarias20-Mar-08 0:47 
GeneralRe: Generic data fetch with IDataReader Pin
mmikey720-Mar-08 5:34
mmikey720-Mar-08 5:34 
GeneralRe: Generic data fetch with IDataReader Pin
RubensFarias23-Mar-08 12:50
RubensFarias23-Mar-08 12:50 
GeneralRe: Generic data fetch with IDataReader Pin
mmikey723-Mar-08 13:07
mmikey723-Mar-08 13:07 
GeneralSome issues with Socket class behavior. Pin
Jack04519-Mar-08 14:30
Jack04519-Mar-08 14:30 
GeneralRe: Some issues with Socket class behavior. Pin
XeoN-Kc19-Mar-08 21:35
XeoN-Kc19-Mar-08 21:35 
GeneralRe: Some issues with Socket class behavior. Pin
Jack04520-Mar-08 5:13
Jack04520-Mar-08 5:13 
GeneralLabel.Text property Pin
MarkB77719-Mar-08 12:23
MarkB77719-Mar-08 12:23 
GeneralRe: Label.Text property Pin
J$19-Mar-08 13:56
J$19-Mar-08 13:56 
GeneralRe: Label.Text property Pin
Luc Pattyn19-Mar-08 16:21
sitebuilderLuc Pattyn19-Mar-08 16:21 
GeneralRe: Label.Text property Pin
SeeSharp19-Mar-08 20:20
SeeSharp19-Mar-08 20:20 
GeneralRe: Label.Text property Pin
MarkB77719-Mar-08 20:36
MarkB77719-Mar-08 20:36 
QuestionUsing Certificates with c# and ASP.NET Pin
sfog19-Mar-08 11:00
sfog19-Mar-08 11:00 
GeneralCross post - please ignore Pin
pmarfleet19-Mar-08 11:15
pmarfleet19-Mar-08 11:15 
GeneralSound editing component Pin
Staffan Sjöstedt19-Mar-08 9:53
Staffan Sjöstedt19-Mar-08 9:53 
Generalvisual C# 2005 exiting Pin
xxmikexx19-Mar-08 7:42
xxmikexx19-Mar-08 7:42 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.