2014-01-28 5 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> 

Я имею а.о. две таблицы в моей базе данных:

  • subschema с, как колонны ID и Name
  • subschemamembers с колоннами, как subschemaID и locusID.

У меня есть следующий 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 узел, петлю над локусы и добавить их. Я попытался создать новый DbDataReader внутри цикла while, но затем я получил ошибки, такие как: There is already an open DataReader associated with this Connection which must be closed first. Итак, как мне это сделать?

Update:

Попытка идти с 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 

, но я до сих пор не может понять, как я буду отслеживать «указывает ли текущая строка db на другой subschemaDbID».

ответ

1

Самый простой способ, что сделает вашу работу решением является включение MARS (несколько активных результирующих наборов): http://technet.microsoft.com/en-us/library/ms131686.aspx

Чтобы сделать это, не позволяя MARS, вы должны сделать JOIN запрос выборки как подсхемы и subschemamembers и внутри вашего кода создания XML вам нужно отслеживать, указывает ли текущая строка db на другой subschemaDbID.

+0

Вы можете увидеть мое обновление? Заранее спасибо. – BioGeek

+0

На каждой итерации цикла вы читаете все поля. У вас есть переменная за пределами цикла, например string currentSubschemaId, которая хранит идентификатор. В цикле, если currentSubschemaId! = Reader ["Id"], пришло время создать новый XElement («Subschema») (и сохранить читателя [«Id»] в currentSubschemaId). –

Смежные вопросы