将 SQL 数据转换为通用列表
Converting SQL Data to List of generic
我有一个 table 充满字符串的字符串,我需要将其转换为具有类型的通用对象列表。到目前为止我有什么。
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个循环是填充对象的最佳方式。
我写了一个 class 来将数据库查询结果映射到过去的对象。此实现中唯一的 "gotcha" 是 SQL 列名称需要匹配 class.
的 属性 名称
这是class:
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);
我有一个 table 充满字符串的字符串,我需要将其转换为具有类型的通用对象列表。到目前为止我有什么。
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个循环是填充对象的最佳方式。
我写了一个 class 来将数据库查询结果映射到过去的对象。此实现中唯一的 "gotcha" 是 SQL 列名称需要匹配 class.
的 属性 名称这是class:
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);