Wednesday, 5 November 2008

Generic function to obtain data from a DataRow

Sometimes it may be useful to have one generic function that can parse data from a DataRow column into the type you require.

For example: Perhaps you have an Employee object with the properties Id, Name and Salary, of types int, string and decimal.

Here is an example of some code to populate a list of Employee objects using a generic function.

public void LoadData()
{
IList employees = new List();
DataTable result = // Get data from SP
foreach (DataRow row in result.Rows)
{
Employee employee = new Employee();
employee.Id = GetColumnData<int>("EMP_ID", row, null);
employee.Name = GetColumnData<string>("EMP_NAME", row, "Unknown");
employee.Salary = GetColumnData<decimal>("EMP_SALARY", row, null);
employees.Add(employee);
}
}

/// 
/// Gets data from a column checks it can convert it correctly if no data or invalid casting the default
/// value is returned
/// 
/// The type of data to convert too
/// The name of the column in the row
/// The row containing the data
/// The default value
/// The data or the default value
public static T GetColumnData<T>(string columnName, DataRow row, object defaultValue)
{
if (row.Table.Columns.Contains(columnName) && row[columnName] != DBNull.Value)
{
string value = row[columnName].ToString();
TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
object result = converter.ConvertFromString(value);
try
{
return (T)result;
}
catch (InvalidCastException)
{
return (T)defaultValue;
}
}
else
{
return (T)defaultValue;
}
}

No comments: