在ADO.NET中,从数据库中获得的数据可以保存在DataTable中,当然这个DataTable可以是强类型的。但是很多时候,我们都是用弱类型的DataTable, 那么有没有一个简单的方法可以把一个DataTable转换为一个特定类型的对象数组?
其实在LINQ To SQL中,用了一些attribute来辅助.net将一个数据库中的table转换为一个Object,这些attribute位于System.Data.Linq.Mapping namespace下,主要是TableAttribute和ColumnAttribute。
假设数据库中有一个user的table,那么我们可以定义一个User的class:
我们用
Column Attribute来标识User的属性在user Table中对应的列名。然后,我们可以为DataTable提供一个扩展方法来将DataTable转换为一个数组:
最后,提供一下如何使用该方法来从数据库中获取user列表(使用MySQL数据库);
当然,DataTable的扩展方法还远没有完善,应该还需要考虑类型转换之类的问题。更进一步的改进可能是利用工具来自动生成User class,这样就能省下一定的工作量。
其实在LINQ To SQL中,用了一些attribute来辅助.net将一个数据库中的table转换为一个Object,这些attribute位于System.Data.Linq.Mapping namespace下,主要是TableAttribute和ColumnAttribute。
假设数据库中有一个user的table,那么我们可以定义一个User的class:
- public class User
- {
- private int id;
- private string name;
- [Column(Name="id")]
- public int ID
- {
- get
- {
- return this.id;
- }
- set
- {
- this.id = value;
- }
- }
- [Column(Name = "name")]
- public string Name
- {
- get
- {
- return this.name;
- }
- set
- {
- this.name = value;
- }
- }
- }
- public static T[] ToObject<T>(this DataTable dataTable)
- where T:new()
- {
- List<T> list=new List<T>();
- foreach(DataRow row in dataTable.Rows)
- {
- T t = new T();
- Type type = t.GetType();
- PropertyInfo[] propertyInfos =type.GetProperties();
- if (propertyInfos != null && propertyInfos.Length > 0)
- {
- foreach (PropertyInfo info in propertyInfos)
- {
- object[] columns =info.GetCustomAttributes(typeof(ColumnAttribute),true);
- if (columns != null && columns.Length == 1)
- {
- ColumnAttribute ca = columns[0] as ColumnAttribute;
- string name = ca.Name;
- if (name == null || name.Length == 0)
- {
- name = info.Name;
- }
- object propertyValue = row[name];
- if (propertyValue == DBNull.Value)
- {
- propertyValue = null;
- }
- info.SetValue(t, propertyValue, null);
- }
- }
- }
- list.Add(t);
- }
- return list.ToArray();;
- }
- using (MySqlConnection connection = new MySqlConnection(this.connectionString))
- {
- connection.Open();
- MySqlDataAdapter dataAdapter = new MySqlDataAdapter("select * from user", connection);
- DataTable dt = new DataTable();
- dataAdapter.Fill(dt);
- User[] users=dt.ToObject<User>();
- //Now we get the user list...
- }