gpt4 book ai didi

c# - 无法将属性值设置为 sqldatareader 类型的目标类型

转载 作者:太空宇宙 更新时间:2023-11-03 12:22:11 26 4
gpt4 key购买 nike

List<T> returnList = new List<T>();
conn.Open();
SqlCommand sCmd = new SqlCommand(query, conn);
SqlDataReader dataReader = sCmd.ExecuteReader();
T t = new T();
PropertyInfo[] p = o.GetType().GetProperties();
while(dataReader.Read())
{
for (int i = 0; i < p.Length; i++)
{
Console.WriteLine(p[i].GetValue(t)+" "+p[i].PropertyType+"
"+dataReader[i].GetType());
p[i].SetValue(dataReader[i], t);
}
returnList.Add(t);
}
return returnList;

我想在运行时从 sqldatareader 对象设置特定属性的值。但是我得到了一个目标类型不匹配的异常,即使两个引用都是相同的类型

最佳答案

这里有两个问题。最主要的是您错误地调用了 SetValue()

来自 MSDN :

public void SetValue(object obj, object value)

所以实际上您是在使用错误放置的参数调用该方法。这样做应该没问题:

p[i].SetValue(t, dataReader[i]);

您将遇到的第二个问题是,最后您的列表将仅包含相同的对象,因为您只创建了一个新对象一次 (T t = new T();。要解决它,您必须将此行放在 while 循环中。

此外,use using为了更清晰的代码,因为你应该在最后处理你的命令......并关闭你的连接。

总而言之,这是最终代码:

List<T> returnList = new List<T>();
conn.Open();
using (SqlCommand sCmd = new SqlCommand(query, conn))
{
SqlDataReader dataReader = sCmd.ExecuteReader();
PropertyInfo[] p = o.GetType().GetProperties();
while(dataReader.Read())
{
T t = new T();
for (int i = 0; i < p.Length; i++)
{
Console.WriteLine(p[i].GetValue(t)+" "+p[i].PropertyType+" "+dataReader[i].GetType());
p[i].SetValue(t, dataReader[i]);
}
returnList.Add(t);
}
}
conn.Close();
return returnList;

关于c# - 无法将属性值设置为 sqldatareader 类型的目标类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46702180/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com