2014-01-28 33 views
1

我試圖創建一個具有以下結構的XML:C#DbDataReader雙迴路

<ResponseSubschemas> 
    <organism>LMO</organism> 
    <Subschema> 
     <id>MLST</id> 
     <name>MLST</name> 
     <loci> 
      <locus>LMO0558</locus> 
      <locus>LMO0563</locus> 
     </loci> 
    </Subschema> 
    <Subschema> 
     <id>MLVST</id> 
     <name>MLVST</name> 
     <loci> 
      <locus>LMO1305</locus> 
      <locus>LMO1089</locus> 
     </loci> 
    </Subschema> 
</ResponseSubschemas> 

我有A.O。兩個表在我的數據庫:

  • subschema與欄目IDName
  • subschemamembers與欄目subschemaIDlocusID

我有下面的C#代碼:

 XElement rootNode = new XElement("ResponseSubschemas", new XElement("organism", organismID)); 

     DbDataReader subschemaReader = conn.Query("SELECT ID, Name FROM subschema WHERE OrganismID = ?", organismDbID); 
     while (subschemaReader.Read()) 
     { 
      string subschemaDbID = (string)subschemaReader["ID"]; 
      XElement subschemaNode = new XElement("Subschema", 
       new XElement("id", subschemaDbID), 
       new XElement("name", subschemaReader["Name"]) 
      ); 
      rootNode.Add(subschemaNode); 


     } 

     responseXml = rootNode.ToString(); 

它創建了下面的部分XML:在

<ResponseSubschemas> 
    <organism>LMO</organism> 
    <Subschema> 
    <id>MLST</id> 
    <name>MLST</name> 
    </Subschema> 
    <Subschema> 
    <id>MLVST</id> 
    <name>MLVST</name> 
    </Subschema> 
</ResponseSubschemas> 

現在我需要添加每個Subschema節點loci節點,環軌跡並添加它們。我試圖在while循環中創建一個新的DbDataReader,但後來我得到如下錯誤:There is already an open DataReader associated with this Connection which must be closed first。那麼,我該怎麼做?

更新:

試圖去與JOIN辦法,我已經制作了下面的SQL:

SELECT subschema.Id, subschema.name as subschemaName, locus.Name as locusName 
FROM subschema 
LEFT JOIN subschemamembers ON subschemamembers.SubSchemaID = subschema.PrimKey 
LEFT JOIN locus ON subschemamembers.LocusID = locus.ID 
WHERE subschema.OrganismID = 6 
ORDER BY subschema.Id; 

這給下面的輸出:

Id  subschemaName locusName 
MLST MLST   LMO0558 
MLST MLST   LMO0563 
MLVST MLVST   LMO1305 
MLVST MLVST   LMO1089 

,但我仍然無法弄清楚我將如何跟蹤「當前數據庫行是否指向不同的subschemaDbID」。

回答

1

最簡單的辦法,這將使您的解決方案的工作是爲了讓MARS(多個活動結果集):http://technet.microsoft.com/en-us/library/ms131686.aspx

要做到這一點不啓用MARS,你將不得不作出一個連接查詢獲取兩個子模式和subschemamembers並且在您的XML創建代碼中,您需要跟蹤當前數據庫行是否指向不同的subschemaDbID。

+0

你能看到我的更新嗎?提前致謝。 – BioGeek

+0

在循環的每次迭代中,都會讀取所有字段。例如,在循環外有一個變量,例如字符串currentSubschemaId,用於存儲該標識。在循環中,如果currentSubschemaId!= reader [「Id」],那麼是時候創建一個新的XElement(「Subschema」)(並將reader [「Id」]存儲到currentSubschemaId中)。 –