我正从数据库表中检索4个字段。现在我想将它们添加到动态列表<>中。如何将这些添加到列表中。 我试过这个:
public class myclass
{
public string StdDetails, StdAdderID;
public DateTime StdAddedDate, StdAddedTime;
}
public void buttonClick()
{
List<myclass> StdList = new List<myclass>();
myclass mc = new myclass();
OdbcCommand readStd =
new OdbcCommand("SELECT StdDetails, StdAddedDate," +
"StdAddedTime, StdAdderID" +
"FROM Students", Conn);
OdbcDataReader readStdreader =
readStd.ExecuteReader(CommandBehavior.SingleRow);
while (readStdreader .Read())
{
mc.StdDetails = readStdreader.GetString(0);
mc.StdDetails = readStdreader.GetString(3);
mc.StdDetails = readStdreader.GetDate(1);
mc.StdDetails = readStdreader.GetDateTime(2);
StdList.Add(mc);
}
MessageBox.Show(StdList[0].ToString());
}
在消息框中,不显示该值?怎么做。请帮忙
//为TYPOS服务:
替换这三行:
mc.StdDetails = readStdreader.GetString(3);
mc.StdDetails = readStdreader.GetDate(1);
mc.StdDetails = readStdreader.GetDateTime(2);
with:
mc.StdAddedDate= readStdreader.GetString(3);
mc.StdAdderID= readStdreader.GetDate(1);
mc.StdAddedTime= readStdreader.GetDateTime(2);
答案 0 :(得分:7)
您只创建myclass
的单个实例,因此您的列表将充满对同一对象的引用。你想要这个:
while (readStdreader.Read())
{
myclass mc = new myclass();
mc.StdDetails = readStdreader.GetString(0);
mc.StdAdderID = readStdreader.GetString(3);
mc.StdAddedDate= readStdreader.GetDate(1);
mc.StdAddedTime = readStdreader.GetDateTime(2);
StdList.Add(mc);
}
请注意我是如何更改已分配的属性的 - 您发布的代码会尝试重复分配给StdDetails
。
您还没有在ToString
中覆盖myclass
,因此调用ToString()
并不会给您带来任何特别有用的信息。
此外:
std
在这里意味着什么?你几乎把它用于所有......)using
语句以可靠的方式关闭读者,命令,连接等。答案 1 :(得分:2)
这不起作用。
首先,您必须在MyClass mc = new MyClass();
内移动while
,因为您必须每次都创建一个新实例,而不是更改现有实例。
其次,调用StdList[0].ToString();
只会输出MyClass
名称,因为您没有为ToString()
方法提供覆盖。
第三,在你的while
中,你总是使用StdDetails
属性,但我认为这是一个错字,因为它不会编译(你将一个字符串分配给一个DateTime,第三次和第四次,并且编译器不喜欢它。)
在消息框中尝试使用StdList[0].StdDetails
代替StdList[0].ToString()
。
答案 2 :(得分:1)
这里有两个基本问题:
myclass
的相同实例。这意味着您的列表反复包含相同的实例,并且由于每次循环迭代时都更新该实例,因此它的值是从DB读取的最后一个值的值。您需要在while循环中执行mc = new myclass()
。myclass
定义未覆盖ToString()
。因此,最后调用StdList[0].ToString()
将只使用默认的ToString()
实现,它返回类型名称,而不是任何有意义的内容。答案 3 :(得分:1)
两件事。您只是将值重新分配给myclass的StdDetails属性,并且您没有访问MessageBox中的任何特定属性。需要做的事:
while (readStdreader .Read())
{
myclass mc = new myclass();
mc.StdDetails = readStdreader .GetString(0);
mc.StdAdderID = readStdreader .GetString(3);
mc.StdAddedDate = readStdreader .GetDate(1);
mc.StdAddedDate = readStdreader .GetDateTime(2);
StdList.Add(mc);
}
MessageBox.Show(StdList[0].StdDetails.ToString());