您的位置:首页 > 数据库

C#读取数据库返回泛型集合(DataSetToList)

2010-12-01 09:00 525 查看

C#读取数据库返回泛型集合(DataSetToList)

一般我们用使用ADO.NET查询数据库返回泛型集合使用SqlDataReader逐行读取数据存入对象

/// <summary>

/// 获取UserInfo泛型集合

/// </summary>

/// <param name="connStr">数据库连接字符串</param>

/// <param name="sqlStr">要查询的T-SQL</param>

/// <returns></returns>

public IList<UserInfo> GetUserInfoAll(string connStr, string sqlStr)

{

using (SqlConnection conn = new SqlConnection(connStr))

{

using (SqlCommand cmd = new SqlCommand(sqlStr,conn))

{

SqlDataReader sdr = cmd.ExecuteReader();

IList<UserInfo> list = new List<UserInfo>();

while (sdr.Read())

{

UserInfo userInfo = new UserInfo();

userInfo.ID = (Guid) sdr["ID"];

userInfo.LoginName = sdr["LoginName"].ToString();

userInfo.LoginPwd = sdr["LoginPwd"].ToString();

list.Add(userInfo);

}

return list;

}

}

}

这样做虽然返回了需要的数据,但如果当数据库表非常多的时候,针对每一个表都需要去建立这样的一个方法,非常麻烦,也增加了重复劳动力。

而直接返回DataSet操作起来又不方便,DataSet是一种弱类型。也不如泛型集合操作效率高!

这个时候就需要我们来提取一个通用的转换方法了DataSetToList。

/// <summary>

/// 获取泛型集合

/// </summary>

/// <typeparam name="T">类型</typeparam>

/// <param name="connStr">数据库连接字符串</param>

/// <param name="sqlStr">要查询的T-SQL</param>

/// <returns></returns>

public IList<T> GetList<T>(string connStr, string sqlStr)

{

using (SqlConnection conn = new SqlConnection(connStr))

{

using (SqlDataAdapter sda = new SqlDataAdapter(sqlStr, conn))

{

DataSet ds = new DataSet();

sda.Fill(ds);

return DataSetToList<T>(ds, 0);

}

}

}

/// <summary>

/// DataSetToList

/// </summary>

/// <typeparam name="T">转换类型</typeparam>

/// <param name="dataSet">数据源</param>

/// <param name="tableIndex">需要转换表的索引</param>

/// <returns>泛型集合</returns>

public IList<T> DataSetToList<T>(DataSet dataSet, int tableIndex)

{

//确认参数有效

if (dataSet == null || dataSet.Tables.Count <= 0 || tableIndex < 0)

return null;

DataTable dt = dataSet.Tables[tableIndex];

IList<T> list = new List<T>();

for (int i = 0; i < dt.Rows.Count; i++)

{

//创建泛型对象

T _t = Activator.CreateInstance<T>();

//获取对象所有属性

PropertyInfo[] propertyInfo = _t.GetType().GetProperties();

for (int j = 0; j < dt.Columns.Count; j++)

{

foreach (PropertyInfo info in propertyInfo)

{

//属性名称和列名相同时赋值

if (dt.Columns[j].ColumnName.ToUpper().Equals(info.Name.ToUpper()))

{

if (dt.Rows[i][j]!=DBNull.Value)

{

info.SetValue(_t, dt.Rows[i][j], null);

}

else

{

info.SetValue(_t, null, null);

}

break;

}

}

}

list.Add(_t);

}

return list;

}

使用这种转换方式需要注意的是实体类(model)的属性必须和数据库表的字段名字一致(大小写可以不考虑);

因为转换时候的匹配是靠属性名称和字段名称匹配的;

当然如果项目中用到了Linq to Sql 的话就不必这种转换,Linq 已经封装好了;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: