将SQL数据转换为通用列表

时间:2015-11-05 16:09:33

标签: c# generics sqldatareader

我有一个充满字符串的表我需要将它转换为带有类型的通用对象列表。到目前为止我所拥有的。

private List<T> ConvertDataToObject<T>(object oClass, string sSQL)
{
    List<T> lReturn = new List<T>();
    SqlConnection sqlCon = new SqlConnection(sqlConnString);
    SqlCommand sqlCom = new SqlCommand(sSQL.ToString());
    sqlCom.Connection = sqlCon;
    try
    {
        sqlCon.Open();
        SqlDataReader sqlDR = sqlCom.ExecuteReader();
        while (sqlDR.Read())
        {
            foreach (var prop in oClass.GetType().GetProperties())
            {
                if (prop.Name == sqlDR[prop.Name])
                { 
                    prop.SetValue(oClass, Convert.ChangeType(sqlDR[prop.Name].ToString().Trim().Replace("'", "''"), prop.PropertyType), null); 
                }
            }
        }
    }
    catch
    { }
    finally
    { sqlCon.Close(); }

    return lReturn;
}

我不认为这是正确的: 1:我需要用对象填充列表,我不确定我该怎么做 2:我不确定2循环是填充对象的最佳方式。

1 个答案:

答案 0 :(得分:1)

我编写了一个类,用于将数据库查询结果映射到过去的对象。唯一的&#34;陷阱&#34;在此实现中,SQL列名称需要与类的属性名称匹配。

这是班级:

public class DataObjectMapper<T> where T : new()
{
    public List<T> MapResultsToObject(IDataReader reader)
    {
        List<T> objects = new List<T>();

        while (reader.Read())
        {
            objects.Add(MapRow(reader));
        }

        return objects;
    }

    private T MapRow(IDataReader reader)
    {
        T item = new T();

        var typeProperties = typeof(T).GetProperties();

        foreach (var property in typeProperties)
        {
            int ordinal = reader.GetOrdinal(property.Name);

            if (!reader.IsDBNull(ordinal))
            {
                property.SetValue(item, reader[ordinal].ToString(), null);
            }
        }

        return item;
    }
}

以及它的使用方式

   DataObjectMapper<T> resultsMapper = new DataObjectMapper<T>();

   SqlDataReader reader = command.ExecuteReader();

   List<T> results = resultsMapper.MapResultsToObject(reader);