zoukankan      html  css  js  c++  java
  • 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。

    代码
    1 /// <summary>
    2 /// 获取泛型集合
    3 /// </summary>
    4 /// <typeparam name="T">类型</typeparam>
    5 /// <param name="connStr">数据库连接字符串</param>
    6 /// <param name="sqlStr">要查询的T-SQL</param>
    7 /// <returns></returns>
    8   public IList<T> GetList<T>(string connStr, string sqlStr)
    9 {
    10 using (SqlConnection conn = new SqlConnection(connStr))
    11 {
    12 using (SqlDataAdapter sda = new SqlDataAdapter(sqlStr, conn))
    13 {
    14 DataSet ds = new DataSet();
    15 sda.Fill(ds);
    16 return DataSetToList<T>(ds, 0);
    17 }
    18 }
    19 }
    代码
    1 /// <summary>
    2 /// DataSetToList
    3 /// </summary>
    4 /// <typeparam name="T">转换类型</typeparam>
    5 /// <param name="dataSet">数据源</param>
    6 /// <param name="tableIndex">需要转换表的索引</param>
    7 /// <returns>泛型集合</returns>
    8   public IList<T> DataSetToList<T>(DataSet dataSet, int tableIndex)
    9 {
    10 //确认参数有效
    11   if (dataSet == null || dataSet.Tables.Count <= 0 || tableIndex < 0)
    12 return null;
    13
    14 DataTable dt = dataSet.Tables[tableIndex];
    15
    16 IList<T> list = new List<T>();
    17
    18
    19 for (int i = 0; i < dt.Rows.Count; i++)
    20 {
    21 //创建泛型对象
    22   T _t = Activator.CreateInstance<T>();
    23
    24 //获取对象所有属性
    25   PropertyInfo[] propertyInfo = _t.GetType().GetProperties();
    26
    27 for (int j = 0; j < dt.Columns.Count; j++)
    28 {
    29 foreach (PropertyInfo info in propertyInfo)
    30 {
    31 //属性名称和列名相同时赋值
    32 if (dt.Columns[j].ColumnName.ToUpper().Equals(info.Name.ToUpper()))
    33 {
    34 if (dt.Rows[i][j]!=DBNull.Value)
    35 {
    36 info.SetValue(_t, dt.Rows[i][j], null);
    37 }
    38 else
    39 {
    40 info.SetValue(_t, null, null);
    41 }
    42
    43 break;
    44 }
    45 }
    46 }
    47 list.Add(_t);
    48 }
    49 return list;
    50 }

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

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

    当然如果项目中用到了Linq to Sql 的话就不必这种转换,Linq 已经封装好了;

    第一次发文章,写的不好请大家包涵。

  • 相关阅读:
    基于Zabbix 3.2.6版本的Discovery
    Zabbix 3.2.6使用注意事项
    Zabbix 3.2.6安装过程
    自动安装lnmp
    [ORACLE]PL/SQL 用户登录出现ORA-12170:TNS:连接超时 等Oracle无法正常登录问题解决方案
    [ORACLE]尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。
    页面从简体字乱码为另外的简体字
    VScode使用问题总结
    数据备份与恢复
    BinLog日志
  • 原文地址:https://www.cnblogs.com/bizprosdd/p/1887821.html
Copyright © 2011-2022 走看看