Creating a generic list from a SqlDataReader
18 Jul 2006
I've just been working on the data access layer for a project at work and found myself
replicating alot of very similar code when it came to looping through the SqlDataReader
and creating and populating a custom object for each IDataRecord (creating lists of
projects, staff etc). I sat back and thought "there must be an easier way to write
not much code, after all this is the world of .NET and C#".
So here's my solution for returning a a generic List<> populated from a SqlDataReader.
public interface IObjectPopulator
{
object Populate(IDataRecord
dr);
}
public class Project
: IObjectPopulator
{
private int?
_id;
public int?
Id
{
get { return _id;
}
internal set
{ _id = value;
}
}
private string _name;
public string Name
{
get { return _name;
}
set { _name = value;
}
}
#region IObjectPopulator
Members
public object Populate(IDataRecord
dr)
{
Project project = new Project();
project.Id = Convert.ToInt32(dr["project_ID"]);
project.Name = Convert.ToString(dr["project_name"]);
return project;
}
#endregion
}
protected List<T>
PopulateList<T>(SqlDataReader reader)
{
ArgumentValidator.CheckForNullReference(reader, "reader");
List<T> list = null;
try
{
list = new List<T>();
while (reader.Read())
{
object o = Activator.CreateInstance(typeof(T));
IObjectPopulator populator = o as IObjectPopulator;
if (populator
!= null)
{
T item = (T)populator.Populate(reader);
list.Add(item);
}
}
}
finally
{
reader.Close();
}
return list;
}
Now
instead of having to loop thru the SqlDataReader in every method that creates a List<> I
can just call
List<Project>
projects = base.PopulateList<Project>(reader);
Saving
myself alot of lines of code.