One of the first things shown to me when I started working in my company was Microsoft’s Data Access Application Block. One thing that bothered me was that I constantly had to convert DataSets it returned to strongly typed DataSets used in our programs, which usually meant merging the returned data set with a newly created DataTable. To relieve myself of those repeating tedious 6 lines of code, I made this little class that converts untyped DataSets and DataTables to a strongly typed DataTable.
In a first attempt to solve this problem, I used reflation to create an instance of the typed DataTable, so I had to pass the method the type of the DataTable, and cast it back to itself.
This is a more elegant solution, using generics:
/// <summary> /// Helper methods and functions. /// </summary> /// <typeparam name="T">A strongly type DataTable. /// A DataTable of type T will be returned from the DataSet. /// </typeparam> public static class DataSetAdapter<T> where T : DataTable, new() { /// <summary> /// Convert the first DataTable from a DataSet to a /// strongly-typed data table. /// </summary> public static T convert(DataSet dataSet) { if (dataSet == null) return null; if (dataSet.Tables.Count == 0) return null; DataTable dataTable = dataSet.Tables[0]; return convert(dataTable); } /// <summary> /// Convert an ordinary DataTable to a strongly-typed /// data table. /// </summary> public static T convert(DataTable dataTable) { if (dataTable == null) return null; T stronglyTyped = new T(); // add data from the regular DataTable to the // strongly typed DataTable. stronglyTyped.Merge(dataTable); return stronglyTyped; } }
The use of the class if pretty straightforward, just pass the DataSet and the Type:
DataSet employeesDataSet = OracleHelper.ExecuteDataset( connectionString, storedProcedure, parameters); EmployeesDataTable employees = DataSetAdapter<EmployeesDataTable>.convert(employeesDataSet);
Links:
Good!
Do you have a similar class for VBasic?
Thanks