namespace DataTableReaderDemonstration
public static class Program
const string CONSOLE_MASK = "ID: {0}, First: {1}, Last: {2}, Birth Date: {3}";
static string[] COLUMN_LIST = { "Id", "FirstName", "LastName", "Birthdate" };
public static void Main()
Console.WriteLine("Demonstrate Dynamic Colulmn Positions\r\n");
var dt = DataTableBuilder.GetSampleDataTable1();
dt = DataTableBuilder.GetSampleDataTable2();
private static void DisplayDataTable(DataTable dt)
Console.WriteLine(dt.TableName);
var reader = new DataTableReader(dt);
var columnPointers = dt.GetColumnPointers(COLUMN_LIST);
reader.GetDbNullInt(columnPointers[0], 0),
reader.GetDbNullString(columnPointers[1], "First"),
reader.GetDbNullString(columnPointers[2], "Last"),
reader.GetDbNullDateTime(columnPointers[3], new DateTime(1900, 12, 31))
internal static class DataTableBuilder
internal static DataTable GetSampleDataTable1()
var result = new DataTable();
result.TableName = "Sample Table 1";
result.Columns.Add("Id", typeof(int));
result.Columns.Add("FirstName", typeof(string));
result.Columns.Add("LastName", typeof(string));
result.Columns.Add("Birthdate", typeof(DateTime));
result.Rows.Add(new object[] { DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value });
result.Rows.Add(new object[] { 1, "Bill", "Bunion", new DateTime(2000, 1, 23) });
result.Rows.Add(new object[] { 2, "Sally", "Smith", new DateTime(1999, 12, 31) });
internal static DataTable GetSampleDataTable2()
var result = new DataTable();
result.TableName = "Sample Table 2";
result.Columns.Add("Id", typeof(int));
result.Columns.Add("FirstName", typeof(string));
result.Columns.Add("Initial", typeof(string));
result.Columns.Add("LastName", typeof(string));
result.Columns.Add("Country", typeof(string));
result.Columns.Add("Birthdate", typeof(DateTime));
result.Rows.Add(new object[] { DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value, DBNull.Value });
result.Rows.Add(new object[] { 1, "Bill", "B", "Bunion", "USA", new DateTime(2000, 1, 23) });
result.Rows.Add(new object[] { 2, "Sally", "S", "Smith", "Equador", new DateTime(1999, 12, 31) });
internal static class DataTableReaderExtensions
internal static int[] GetColumnPointers(this DataTable dt, string[] columnNameList)
var itemCount = columnNameList.Length;
var result = new int[itemCount];
for (int i = 0; i < columnNameList.Length; i++)
result[i] = dt.Columns[columnNameList[i]].Ordinal;
internal static string GetDbNullString
this DataTableReader reader,
var result = reader.IsDBNull(ordinalPosition)
: reader.GetString(ordinalPosition);
internal static int GetDbNullInt
this DataTableReader reader,
var result = reader.IsDBNull(ordinalPosition)
: reader.GetInt32(ordinalPosition);
internal static DateTime GetDbNullDateTime
this DataTableReader reader,
var result = reader.IsDBNull(ordinalPosition)
: reader.GetDateTime(ordinalPosition);