2011-06-29 35 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()); 
相關問題