나는 다음과 같은 구조의 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 호를 내 데이터베이스에서 두 테이블 :
subschema
ID
열로와 열subschemaID
및locusID
으로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를 가리키는 지 여부"를 어떻게 추적 할 것인지 파악할 수 없습니다.
내 업데이트를 볼 수 있습니까? 미리 감사드립니다. – BioGeek
루프를 반복 할 때마다 모든 필드를 읽습니다. 루프 외부에 변수 (예 : currentSubschemaId 문자열)가 있는데이 ID를 저장합니다. 루프에서 currentSubschemaId! = reader [ "Id"]이면 새 XElement ("Subschema")를 만들고 currentSubschemaId에 reader [ "Id"]를 저장합니다. –