2011-11-22 37 views
1

我想獲取一個值列表,當我得到一個值後,我傳遞該值並調用相同的方法。遞歸循環缺少c中的第一個值#

如果結構就像

60 
| 
61 
| 
63 
| 
64 

代碼工作正常,返回所有值當我通過60

但是當結構就像是

60 
    | | 
    61 63 
    | 
    62 

所以這裏61和63的父母ID是60.

然後組織ID傳遞到第一個前ecution是63,因爲61和63是同時讀取的,63是最後讀取的orgid,所以它傳遞63到下一個循環,它返回0,循環結束。因此沒有使用orgid 61完成執行,所以錯過了62。我在這裏做了什麼錯誤。當閱讀器在同一個查詢中讀取2個值時,讀取的第二個值被傳遞。我想傳遞查詢中讀取的所有值。

private DataSet BindGridView(int id, List<int> userids) 
{ 
    string GetOrgIDs = "select OrganisationID from tbl_organisation where ParentID [email protected]"; 
    MySqlParameter[] paramet = new MySqlParameter[1]; 
    paramet[0] = new MySqlParameter("@ParentID", MySqlDbType.Int32); 
    paramet[0].Value = id; 
    int Orgid = 0; 
    MySqlDataReader reader = server.ExecuteReader(CommandType.Text, GetOrgIDs, paramet); 
    while (reader.Read()) 
    { 
     Orgid = Convert.ToInt32(reader["OrganisationID"]); 
     userids.Add(Orgid); 
    } 
    reader.Close(); 
    if (Orgid != 0) 
    { 
     BindGridView(Orgid, userids); 
    } 
} 

我調用該方法從頁面加載

List<int> OrgIDs = new List<int>(); 
       OrgIDs.Add(60); 
       BindGridView(60, OrgIDs); 

我使用MySQL數據庫

回答

2

您正在遞歸找到最後一個id的父項。因此你忽略了任何可能的早期值的孩子。

將找到的值添加到該列表參數和(新)本地列表中。然後遍歷該本地列表並遞歸,如果值!= 0。

這樣,您將不會打開多個結果集。

private DataSet BindGridView(int id, List<int> userids) 
{ 
    string GetOrgIDs = "select OrganisationID from tbl_organisation where ParentID [email protected]"; 
    MySqlParameter[] paramet = new MySqlParameter[1]; 
    paramet[0] = new MySqlParameter("@ParentID", MySqlDbType.Int32); 
    paramet[0].Value = id; 
    List<int> children = new List<int>(); // new local list 
    MySqlDataReader reader = server.ExecuteReader(CommandType.Text, GetOrgIDs, paramet); 
    while (reader.Read()) 
    { 
     int orgid = Convert.ToInt32(reader["OrganisationID"]); 
     userids.Add(orgid); 
     children.Add(orgid); // also add to local list 
    } 
    reader.Close(); 

    foreach(int child in children) 
    if (child != 0) 
    { 
     BindGridView(child, userids); 
    } 
} 
+0

你能告訴我一些代碼嗎?謝謝 – Mark

+0

我已經添加了它:-) –

4

你的遞歸調用都需要在while循環中坐,以調用每個ORGID,然而這會導致多個同時讀取連接到您的數據庫資源可能是一個問題。

while (reader.Read()) 
{ 
    Orgid = Convert.ToInt32(reader["OrganisationID"]); 
    userids.Add(Orgid); 
    if (Orgid != 0) 
    { 
     BindGridView(Orgid, userids); 
    } 
} 
reader.Close(); 
+0

好的,這裏如果60通過,首先得到61,然後61傳遞給方法,我得到62,但我不會錯過63,我也會得到已經有一個開放的DataReader與這個連接關聯必須先關閉。錯誤 – Mark

0

該循環可以運行100次。

while (reader.Read()) 
{ 
    Orgid = Convert.ToInt32(reader["OrganisationID"]); 
    userids.Add(Orgid); 
} 
reader.Close(); 

所有記錄循環後OrdId只有最後一個值。

if (Orgid != 0) 
{ 
    BindGridView(Orgid, userids); 
} 

BindGridView(Orgid,userids);只在reader.read()循環中的最後一個OrgId上被調用。

我認爲它只會在63(取決於數據順序)上調用BindGridView,並跳過61和之前的任何其他。

+0

是的,這是我想解決的問題 – Mark

+0

對不起,我應該添加一些示例代碼來糾正。 Andy和Hans還有其他一些很好的例子。 – user1231231412