SQLDataReaderToList 数据读取器转换到List

本文介绍了一种将SQLDataReader中的数据自动转换为泛型List<T>的方法,通过编写通用方法简化了从数据库读取数据并填充到List的过程。

现在开发项目都用到3层架构,bll dal model 大量使用list来返回列表数据,
每次都需要手动写一堆代码把每行数据写到List中。

public class UserInfo
{
   public string Age
   {
       get;
       set;
   }

    public string Sex
    {
       get;
       set;
    }
}
```
List<UserInfo> UserInfoList= new List<UserInfo>
while(reader.Read())
{
      UserInfo userinfo = new UserInfo();
      userinfo.Age = reader["Age"].ToString();
      userinfo.Sex= reader["Sex"].ToString();
      UserInfoList.add(userinfo);
}

GridView1.DataSource = UserInfoList;
GridView1.DataBind()
这样写字段太多的话工作量太大了,有没有一种自动转到列的方法呢
代码可以也样写的


protected List<T> DataReaderToList<T>(SqlDataReader SDR) where T : class
    {
        List<T> ListData = new List<T>();

        if (SDR.HasRows)
        {
            ListData.Clear();
            while (SDR.Read())
            {
                object Obj = System.Activator.CreateInstance(typeof(T));
                Type ObjType = Obj.GetType();
                #region 一行数据赋值给一个对象
                for (int i = 0; i < SDR.FieldCount; i++)
                {
                    PropertyInfo PI = ObjType.GetProperty(SDR.GetName(i));
                    if (PI != null)
                    {
                        string PTName = PI.PropertyType.Name.ToString();
                        string FullName = PI.PropertyType.FullName;
                        string Name = PI.Name;

                        object Value = PI.GetValue(Obj, null);

                        switch (PI.PropertyType.ToString())
                        {
                            case "System.Int64":
                                PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToInt64(SDR[Name]), null);
                                break;
                            case "System.Byte[]":
                                PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : (byte[])SDR[Name], null);
                                break;
                            case "System.Boolean":
                                PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToBoolean(SDR[Name]), null);
                                break;
                            case "System.String":
                                PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToString(SDR[Name]), null);
                                break;
                            case "System.DateTime":
                                PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToDateTime(SDR[Name]), null);
                                break;
                            case "System.Decimal":
                                PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToDecimal(SDR[Name]), null);
                                break;
                            case "System.Double":
                                PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToDouble(SDR[Name]), null);
                                break;
                            case "System.Int32":
                                PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToInt32(SDR[Name]), null);
                                break;
                            case "System.Single":
                                PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToSingle(SDR[Name]), null);
                                break;
                            case "System.Byte":
                                PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToByte(SDR[Name]), null);
                                break;
                            default:
                                int Chindex = PTName.IndexOf("Nullable");
                                if (FullName.IndexOf("System.Int64") >= 0)
                                {
                                    PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToInt64(SDR[Name]), null);
                                }

                                if (FullName.IndexOf("System.Boolean") >= 0)
                                {
                                    PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToBoolean(SDR[Name]), null);
                                }

                                if (FullName.IndexOf("System.String") >= 0)
                                {
                                    PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToString(SDR[Name]), null);
                                }

                                if (FullName.IndexOf("System.DateTime") >= 0)
                                {
                                    PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToDateTime(SDR[Name]), null);
                                }

                                if (FullName.IndexOf("System.Decimal") >= 0)
                                {
                                    PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToDecimal(SDR[Name]), null);
                                }

                                if (FullName.IndexOf("System.Double") >= 0)
                                {
                                    PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToDouble(SDR[Name]), null);
                                }

                                if (FullName.IndexOf("System.Int32") >= 0)
                                {
                                    PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToInt32(SDR[Name]), null);
                                }

                                if (FullName.IndexOf("System.Single") >= 0)
                                {
                                    PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToSingle(SDR[Name]), null);
                                }

                                if (FullName.IndexOf("System.Byte") >= 0)
                                {
                                    PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToByte(SDR[Name]), null);
                                }

                                if (FullName.IndexOf("System.Int16") >= 0)
                                {
                                    PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToInt16(SDR[Name]), null);
                                }

                                if (FullName.IndexOf("System.UInt16") >= 0)
                                {
                                    PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToUInt16(SDR[Name]), null);
                                }

                                if (FullName.IndexOf("System.UInt32") >= 0)
                                {
                                    PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToUInt32(SDR[Name]), null);
                                }

                                if (FullName.IndexOf("System.UInt64") >= 0)
                                {
                                    PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToUInt64(SDR[Name]), null);
                                }

                                if (FullName.IndexOf("System.SByte") >= 0)
                                {
                                    PI.SetValue(Obj, SDR.IsDBNull(SDR.GetOrdinal(Name)) ? Value : Convert.ToSByte(SDR[Name]), null);
                                }
                                break;
                        }

                    }
                }
                #endregion
                ListData.Add(Obj as T);
            }
        }
        if (!SDR.IsClosed)
            SDR.Close();

        return ListData;
    }

var UserInfoList = DataReaderToList(reader);
GridView1.DataSource = UserInfoList;
GridView1.DataBind();
“`

一句话就搞定了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值