2011-06-29 34 views
0

我从我的数据库表中检索4个字段。现在我想将它们添加到动态列表<>。如何将这些添加到列表中。 我尝试这样做:类型类的列表,将值添加到数据类型的List <>类CLASS

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()); 
} 

在消息框中不显示值?以do.please什么帮助

//遗憾的错别字:

替代这些三线:

mc.StdDetails = readStdreader.GetString(3); 
     mc.StdDetails = readStdreader.GetDate(1); 
     mc.StdDetails = readStdreader.GetDateTime(2); 

有:

mc.StdAddedDate= readStdreader.GetString(3); 
       mc.StdAdderID= readStdreader.GetDate(1); 
       mc.StdAddedTime= readStdreader.GetDateTime(2); 
+0

对于一个它看起来像你重新分配所有的数据库值只是'myclass'的StdDetails属性。 StdDetails将始终等于readStdreader.GetDateTime(2),其余属性将为null。 –

回答

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

你也没有重写ToStringmyclass,所以调用ToString()是不会给你什么特别有用的。

此外:

  • 你应该看看.NET命名约定;目前,你的命名已遍布商店。 (std是什么意思?你几乎所有的东西都用它了)
  • 公有领域是一个非常糟糕的主意;使用属性代替
  • 使用using语句以可靠方式关闭读取器,命令,连接等。
+0

先生,其发出索引范围错误 – sqlchild

+0

@sqlchild:在哪里?如果*在while循环之后,可能没有任何行? –

+0

@Jon:关于你的问题,他的代码中的“Std”意味着什么,我的通灵能力表示它是“student”的简称:) – Sven

1

这里有两个基本问题:

  1. 您正在重用的每次myclass相同的实例。这意味着您的列表一遍又一遍地包含相同的实例,并且由于每次循环迭代时更新该实例,其值就是从数据库读取的最后一个值。您需要在while循环中执行mc = new myclass()
  2. 您的myclass定义不会覆盖ToString()。所以在最后调用StdList[0].ToString()将只使用默认的ToString()实现,该实现返回类型名称,没有任何意义。
2

它不工作的方式。

首先,您必须在while内移动MyClass mc = new MyClass();,因为您必须每次创建一个新实例,而不是更改现有的实例。

其次,调用StdList[0].ToString();将仅输出MyClass名称,因为您没有提供对ToString()方法的覆盖。

第三,在你的while你总是使用StdDetails属性,但我认为这是一个错字,因为它不会编译(你分配一个字符串为DateTime第三和第四时间,编译器不喜欢它)。

用消息框中的StdList[0].StdDetails而不是StdList[0].ToString()来尝试。

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()); 
相关问题