我试图动态地从数据库中获取数据。我有list<T> select<T>()
方法...继续我的问题我可以通过使用datareader得到数据这里是代码:
public list<T> Select<T>()
{
Type type = typeof(T);
...
...
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
try
{
SqlCommand sqlCommand = new SqlCommand(selectCommand, connection);
connection.Open();
SqlDataReader sqlReader = sqlCommand.ExecuteReader();
while (sqlReader.Read())
{
foreach (PropertyInfo property in type.GetProperties())
{
property.SetValue( property.Name,(PropertyInfo)sqlReader[property.Name],null);
}
typeList.Add((T)Convert.ChangeType(type,typeof(T)));
}
sqlReader.Close();
}
catch (Exception ex)
{
string exc = ex.Message;
}
finally
{
connection.Close();
}
}
return typeList;
}
我可以获取数据,但我无法将其分配给我的类型,所以我无法将我的类型添加到我的类型列表中,可以帮助我
答案 0 :(得分:1)
在能够将属性分配给类型之前,您需要实例化它:
T instance = Activator.CreateInstance<T>();
foreach (PropertyInfo property in type.GetProperties())
{
property.SetValue(instance, sqlReader[property.Name], null);
}
typeList.Add(instance);
还要将SqlCommand
包裹在using
块中,以便妥善处理它。另一个注意事项是,您不需要在finally块中.Close()
建立连接,这将由Dispose
方法自动完成,因为您已将连接包装在using
中块。
答案 1 :(得分:1)
看起来您想为每个数据库行创建一个T类型的对象。
然后你可以将你的泛型约束到具有空构造函数的类:
public List<T> Select<T>() where T : new()
然后你可以创建新的T
while (sqlReader.Read())
{
T item = new T();
foreach (PropertyInfo property in type.GetProperties())
{
// Note the first parameter "item"
property.SetValue(item, sqlReader[property.Name], null);
}
typeList.Add(item);
}
答案 2 :(得分:0)
您要在此处转换哪些数据类型?您可能应该根据查询选择数据,这看起来就像您尝试将整个数据库存储在一个随机提供的类型中。您可能正试图将文本存储在双...
中如果您只想存储数据库中的所有数据,请使用DataSet或DataTable。
你还在这做什么?
property.SetValue( property.Name,(PropertyInfo)sqlReader[property.Name],null);
看起来您正在尝试更改所请求类型的属性名称...