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

내가 가진을 미국 특허 제 4198037 호를 내 데이터베이스에서 두 테이블 :

  • subschemaID 열로와 열 subschemaIDlocusID으로 Name
  • subschemamembers와.

나는 다음과 같은 C# 코드가 다음을 통해

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

가 지금은 각 Subschema 노드의 loci 노드를 추가 할 필요가 루프 다음 ​​부분 XML을 생성

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

을 loci를 추가하십시오. 나는 while 루프 안에 새로운 DbDataReader을 만들려고했으나, 다음과 같은 에러가 발생했다 : There is already an open DataReader associated with this Connection which must be closed first. 그래서, 어떻게해야합니까?

업데이트 :

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 

하지만 난을 JOIN 접근 방식으로 이동하려고

, 나는 다음과 같은 SQL을 정교하게 제작 한 "현재 db 행이 다른 subschemaDbID를 가리키는 지 여부"를 어떻게 추적 할 것인지 파악할 수 없습니다.

답변

1

솔루션 작업을 할 것이다 밖으로 쉬운 방법은 MARS (다중 활성 결과 집합)를 활성화하는 것입니다 http://technet.microsoft.com/en-us/library/ms131686.aspx

을 MARS를 사용하지 않고이를 수행하려면, 당신은이 하위 스키마 및 subschemamembers 모두를 가져 오는 쿼리를 가입 할 것 XML 작성 코드 내에서 현재 db 행이 다른 subschemaDbID를 가리키는 지 여부를 추적해야합니다.

+0

내 업데이트를 볼 수 있습니까? 미리 감사드립니다. – BioGeek

+0

루프를 반복 할 때마다 모든 필드를 읽습니다. 루프 외부에 변수 (예 : currentSubschemaId 문자열)가 있는데이 ID를 저장합니다. 루프에서 currentSubschemaId! = reader [ "Id"]이면 새 XElement ("Subschema")를 만들고 currentSubschemaId에 reader [ "Id"]를 저장합니다. –